如何通过点击mfc创建模态对话框框上一按键打卡开另一非mfc创建模态对话框框(已实现)的同时关闭该mfc创建模态对话框框(为实现)?

MFC中,模态和非模态对话框的关闭问题_百度知道
MFC中,模态和非模态对话框的关闭问题
存在主窗口,创建一个窗口1(模态对话框),窗口1中创建窗口2(非模态)问题是珐耿粹际诔宦达为惮力窗口2关闭的时候,居然能控制主窗口再创建一个窗口1,求解决办法
提问者采纳
贴出窗口1中,窗口2的创建部分的代码。一般可能是窗口2创建的时候,没有明确父窗口珐耿粹际诔宦达为惮力关系或者错误的父窗口造成的,这里要将窗口1的句柄作为父窗口。另外,这个问题确实比较古怪,模态关系是很难破坏的,应该是哪个地方做了错误的逻辑处理或者窗口操作,这个不好说一定是哪里的问题。
提问者评价
非常感谢!确实是父窗口句柄没传上。
其他类似问题
为您推荐:
其他2条回答
模态对话框工作状态:当它获得焦点时,将垄断用户的输入,在完成本对话框之前,用户无法对本程序的其他部分进行操作。
非模态对话框类似于WORD里的查找替换,就在应用程序打开非模态对话框的同时还可以切换到其他窗口进行操作。
二者的类都派生于CDialog类,而CDialog类派生于CWnd类。
模态对话框使用CDialog::DoModal函数创建以及销毁。初始化消息WM_INITDIALOG,调用OnInitDialog初始化并显示,创建完毕后,DoModal启动消息循环。
非模态对话框使用CDialog::Create实现。由于Create函数不会启动新的消息循环,对话框与应用程序共用一个消息循环,就不会独占用户输入,Create函数在对话框显示后就立即返回。DoModal是在对话框关闭后才返回。对话框关闭后说明对话框窗口的对象已经销毁,...
我是问窗口2关闭了之后,窗口1还没关闭,但是没有独占用户输入,主窗口变成可用的了
估计楼主 在 窗口1创建窗口2的时候 没有传this指针
即将窗口1 设为窗口2 的父窗口
谢谢,楼上的老师先回答了,两位都答的非常好
非模态对话框的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁亲们帮帮忙啊 ~在模态对话框外的地方单击时关闭该对话框怎么实现?
[问题点数:40分,结帖人wangyr0408]
亲们帮帮忙啊 ~在模态对话框外的地方单击时关闭该对话框怎么实现?
[问题点数:40分,结帖人wangyr0408]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年7月 VC/MFC大版内专家分月排行榜第二2016年6月 VC/MFC大版内专家分月排行榜第二2015年6月 VC/MFC大版内专家分月排行榜第二
2016年4月 VC/MFC大版内专家分月排行榜第三2015年4月 VC/MFC大版内专家分月排行榜第三2012年8月 VC/MFC大版内专家分月排行榜第三
2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。Windows编程(12)
所有的对话框类都基于CDialog基类,CDialog类又继承于CWnd类。对话框分为模态对话框和非模态对话框
(一)创建模态对话框:
void CMyboleView::OnDialog()
// TODO: Add your command handler code here
dlg.DoModal();
CDialog::DoModal()创建、显示模态对话框并停止程序直到模态对话框被关闭,细心的同学会发现,你定义的对话框类的对象是个局部变量,当OnDialog函数一旦执行完毕那么对象dlg的生命周期就结束了,与该对象相关联的对话框就会被销毁了,也就是说你创建的对话框会一闪而逝或者不显示了,事实会是这样吗?不会,因为当执行到DoModal函数时,程序会在该条语句处停止,这也是DoModal函数的一个功能,直到模态对话框关闭(用EndDialog函数来关闭一个模态对话框),也就是说dlg的生命周期的结束是在模态对话框结束关闭的时候。
CDialog::EndDialog()关闭一个模态对话框,该函数的返回值作为DoModal的返回值,它只是隐藏了模态对话框,并没有将之销毁。
(二)创建非模态对话框:
void CMyboleView::OnDialog()
// TODO: Add your command handler code here
dlg.DoModal();
CDialog::Create()创建一个非模态对话框并将该非模态对话框资源与dlg对象相关联,该函数的功能比较弱,在调用该函数创建一个非模态对话框还需要调用dlg.ShowWindow(SW_SHOW)函数来显示。因为该函数没有DoModal的停止功能,所以dlg对象不能是局部变量,也就是说dlg的生命周期不能随着OnDialog函数的结束而结束,解决办法有二,第一种是将dlg设置成全局变量,第二种是定义一个指针子,再堆上分配内存,用new来分配一个堆空间(堆空间里的变量的生命周期与整个程序的生命周期是一致的),代码如下:
voidCMyboleView::OnDialog()
// TODO: Add your command handler codehere
dlg.DoModal();
dlg.Create(IDD_DIALOG1,this);
dlg.ShowWindow(SW_SHOW);*/
CTestDlg *pDlg=new CTestDlg();
pDlg-&Create(IDD_DIALOG1,this);
pDlg-&ShowWindow(SW_SHOW);
不过一旦该函数结束后,创建的非模态对话框就不能被引用了。因为OnDialog函数结束后pDlg的生命周期结束了,就不能通过指针pDlg保存的地址来找到原先分配的内存了,需要在析构函数中delete这块内存。
CWnd::ShowWindow()用来设置一个窗体的显示状态,因为对话框类继承于CWnd,所以对话框也是一个窗口。
(三)小结:
&&& OnOk和OnCancel函数是CDialog类的虚函数。
对于模态对话框上的Ok按钮和cancel按钮被点击时,如果OnOk和OnCancel函数没有被覆盖,那么就会调用CDialog类的OnOk和OnCancel函数,此时模态对话框会被destroy掉。
&&&&&& 对于非模态对话框上的Ok按钮和Cancel按钮被点击时,如果OnOk和OnCancel函数也没有被覆盖,那么程序调用的也是CDialog类的OnOk和OnCancel函数,但这两个函数仅仅使非模态对话框不可见,所以当在一个非模态对话框上实现Ok按钮时必须重写OnOk函数,并且在重写的OnOk函数里调用DestroyWindow函数,不要调用基类的EndDialog函数。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7430次
排名:千里之外
原创:25篇
转载:55篇
(1)(1)(2)(4)(8)(7)(3)(9)(7)(7)(2)(2)(2)(8)(17)MFC编程中怎么弹出非模态对话框?_百度知道
MFC编程中怎么弹出非模态对话框?
就是点一下确定就弹出另一个对话框,这个是用非模态对话框对吗我想制作一个类似于调查问卷那样的程序?如果是那该怎么弹出非模态对话框,同时关闭之前那个对话框
提问者采纳
4析构函数中使用DELETE删除非模态对话框对象的父窗口,使用new来创建一个非模态对话框对象的父窗口的构造函数。提供这样一个想法,或者自己尝试一下印象是深刻的?框,下面说一下步骤吧,重写OnCancel的()函数调用DestroyWindow()来关闭非模态对话框,非模态对话框创建,一些语句可以做出来首先,父窗口不是的DestroyWindow(),建议还是先C + +语言,掌握去学习VC + +希望采纳?。 1,调用基类的函数创建()打开的对话,创建和删除非模态对话框是更复杂的; 3,但你可以隐藏父窗口达到目的;二,并没有提供源代码。如果C + +语言尚未掌握; 2
提问者评价
其他类似问题
1人觉得有用
为您推荐:
其他2条回答
这跟模态非模态对话框没关系如果没理解错的话,你要的功能就是在主界面点击按钮弹出一个对话框(模态,简单点),然后让主界面对话框隐藏就可以了
看一看这边文章
非模态对话框的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别
先看一下 MSDN 的原文:
When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don’t call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for
modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.
MS的指示:非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。
了解了理论过后,下面我们就可以用代码实现一下非模态对话框的创建和销毁过程:
CTestDlg *pDlg=new CTestD
pDlg-&Create(IDD_TESTDLG,this);
pDlg-&ShowWindow(SW_SHOW);
void CTestDlg()
DestroyWindow();
void CTestDlg()
CDialog();
如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到OnCancel函数即可。
以下是一点资料供参考,非模态对话框的销毁顺序:
MFC应用程序中处理消息的顺序
1.AfxWndProc()
该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2.AfxCallWndProc()
该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数
3.WindowProc()
该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg()
该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息
调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个
能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand()
该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg()
根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow()
该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)
2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo()
该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸
4.OnNcCreate()
该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建
5.OnNcCalcSize()
该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小
6.OnCreate()
该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建
7.OnSize()
该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化
8.OnMove()
消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify()
该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose()
消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息
2.OnDestroy()
消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy()
消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息
4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal()
重载函数,重载DoModal()成员函数
2.PreSubclassWindow()
重载函数,允许首先子分类一个窗口
3.OnCreate()
消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
4.OnSize()
消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove()
消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont()
消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体
7.OnInitDialog()
消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件
8.OnShowWindow()
消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用
9.OnCtlColor()
消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色
OnChildNotify()
重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose()
消息响应函数,响应WM_CLOSE消息,当”关闭”按钮被单击的时候,该函数被调用
2.OnKillFocus()
消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送
3.OnDestroy()
消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
4.OnNcDestroy()
消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送
5.PostNcDestroy()
重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow()
重载函数,允许用户首先子分类一个窗口
2.OnCreate()
消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
3.OnSize()
消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove()
消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont()
消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3645次
排名:千里之外
原创:13篇
(2)(2)(1)(1)(1)(1)(1)(2)(1)(3)(5)(2)}

我要回帖

更多关于 mfc创建模态对话框 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信