请问对话框能SHOWWINDOW却不能DOMODAL的原因?

wbamboo 2002-04-01 10:43:29
1.有一对话框dlgTest,能ShowWindow()出来,但用DoModal()却报系统级错误,请问出现这种情况一般是什么原因?
2.对话框ShowWindow出来后,怎样才能不Show出多个对话框?即如何如何保证该对话框最多只有一个实例在运行?
...全文
664 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cowmax 2002-04-01
  • 打赏
  • 举报
回复
这就是传说中Modeless Dialog Boxes 和 Modal Dialog Boxes 的区别之一
fly_woman 2002-04-01
  • 打赏
  • 举报
回复
1.
通过调用CDialog::Create函数来启动对话框,而不是CDialog::DoModal,这是非模态对话框的关键所在。由于Create函数不会启动新的消息循环,对话框与应用程序共用同一个消息循环,这样对话框就不会垄断用户的输入。Create在显示了对话框后就立即返回,而DoModal是在对话框被关闭后才返回的。众所周知,在MFC程序中,窗口对象的生存期应长于对应的窗口,也就是说,不能在未关闭屏幕上窗口的情况下先把对应的窗口对象删除掉。由于在Create返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,因此只好在堆中构建对话框对象,而不能以局部变量的形式来构建之。非模态对话框的模板必须具备Visible风格,最保险的方法是调用CWnd::ShowWindow(SW_SHOW)来显示对话框,而不管对话框是否具有Visible风格

2.在调用该对话框的文件中定义一个对话框标志
CTestDlg *m_TestDlg;
初始化 m_TestDlg=NULL;

调用时:
if(m_pRegisterDlg)
m_TestDlg->SetActiveWindow(); //激活对话框
else
{
//创建非模态对话框
m_TestDlg=new CTestDlg(this);
m_TestDlg->Create(IDD_TESTDLG,this);
}
删除对话框
void CTestDlg::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this; //删除对话框对象
}
void CTestDlg::OnCancel()
{
// TODO: Add extra cleanup here

((CTestView*)m_pParent)->m_TestDlg=NULL;
DestroyWindow(); //删除对话框
}





wbamboo 2002-04-01
  • 打赏
  • 举报
回复
TO ky640(exec):
我也是这么来的,但第二句dlg.DoModal()报错
还有我真得想知道第二个问题的好方法
wbamboo 2002-04-01
  • 打赏
  • 举报
回复
TO ky640(exec):
我也是这么来的,但第二句dlg.DoModal()报错
还有我真得想知道第二个问题的好方法
ky640 2002-04-01
  • 打赏
  • 举报
回复
1.对话框是Create出来的,改成:
C**Dlg dlg;
dlg.DoModal();
2.实现方法很多,而且没有什么实际意义。
opium 2002-04-01
  • 打赏
  • 举报
回复
我也有个问题问以下好吗;那么你们是怎么来响应非模态对话框中的消息的呢?能在非模态对话框中画图吗?(用pDC->rectangle();)
fuhaitao 2002-04-01
  • 打赏
  • 举报
回复
你创建得是模态对话框,当然不能显示多个了
wbamboo 2002-04-01
  • 打赏
  • 举报
回复
还有高手要发表意见吗?今天下班前结分
采用MFC编程时,子对话框常常要向主窗口传递数据,获取主窗口的对象指针便显得非常重要了。 void CMyView::OnModel() //点击菜单,创建对话框的几种变量设置,总共是4种方法,模态的一种,非模态的三种 { // TODO: Add your command handler code here //CDialog modDlg(MAKEINTRESOURCE(IDD_MODEL),this); //modDlg.DoModal(); static bool num=0;//第一次执行第一段,以后再打开都执行第二段。 static CModDlg Dlgless(this);//将MyView指针传进去 if (0==num) { CModDlg mod(this);//将MyView指针传进去 //mod.SetWindowText("局部变量——模态对话框");不允许动态设置模态对话框标题?这句编绎会出错 mod.DoModal(); Dlgless.Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好 Dlgless.ShowWindow(SW_SHOW); Dlgless.SetWindowText("局部静态变量——非模对话框"); m_dlgless.Create(IDD_MODEL,this);//重复执行会出错,要放到构造函数中好 m_dlgless.ShowWindow(SW_SHOW); m_dlgless.SetWindowText("成员非指针变量——非模对话框"); m_pDlgless=new CModDlg(this);//重复执行会出错,要放到构造函数中好, m_pDlgless->Create(IDD_MODEL);//重复执行会出错,要放到构造函数中好, m_pDlgless->ShowWindow(SW_SHOW); m_pDlgless->SetWindowText("成员指针变量——非模对话框"); num=1; } else { Dlgless.ShowWindow(SW_SHOW); m_dlgless.ShowWindow(SW_SHOW); m_pDlgless->ShowWindow(SW_SHOW); } }
编写一个如示例WinMain的Windows应用程序,其中窗口的背景色、光标、图标等属性可以设置成自己喜欢的风格。作为该示例的扩展,要求编程实现当在该窗口中单击右键时,播放一曲自己喜欢的音乐。(4学时) 编写一个如示例ExDlgCtl的MFC对话框应用程序,其中必须实现的功能包括: “对话框”菜单下的模态对话框、非模态对话框和文件对话框; “控件”菜单下的计算器、动态创建按钮、上网问卷调查、调整对话框背景色等四个对话框。 示例中的其它功能可以根据实际情况决定是否编写。(4学时) 3)编写一个如示例ExMenu的MFC菜单、工具栏和状态栏的应用程序,编写该实验时注意功能的完整性,包括两个菜单的切换、右键弹出式菜单、工具栏的切换、状态栏信息格的添加等功能。(4学时) 4)编写一个如示例ExDraw的MFC绘图应用程序,实现画点、线、矩形、椭圆等图形,并可以根据用户选择的画笔和画刷进行绘制,最后要求实现画笔的功能。(4学时) LRESULT CALLBACK WinProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window ) { WNDCLASS wndclas; wndclas.cbClsExtra=0; wndclas.cbWndExtra=0; wndclas.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndclas.hCursor=LoadCursor(NULL,IDC_ARROW); wndclas.hIcon=LoadIcon(NULL,IDI_EXCLAMATION); wndclas.hInstance=hInstance; wndclas.lpfnWndProc=WinProc; wndclas.lpszClassName="ABCD"; wndclas.lpszMenuName=NULL; wndclas.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndclas;); void CTestView::OnDialogModal() //模态对话框 { // TODO: Add your command handler code here CTestDlg1 dlg; dlg.DoModal(); } void CTestView::OnDialogModalless()//非模态对话框 { // TODO: Add your command handler code here CTestDlg2 *pd=new CTestDlg2(); pd->Create(IDD_DIALOG2,this); pd->ShowWindow(SW_SHOW); } void CTestView::OnDialogFile() //文件对话框 {

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧