您的位置:首页 > 其它

模态对话框和非模态对话框的创建与销毁

2018-01-04 16:43 267 查看
首先声明:在网上看了很多资料,很多内容也是从别人那里学到的,只是结合自己的使用写下来。

在VS中对话框分两种:模态对话框和非模态对话框。

模态对话框就是一旦我被打开了,就得完全做我的事情,只有把我关了,你才能做其他的事情。

非模态对话框就是你把我打开了,可以去干点别的,什么时候想起我来了,就用用,甚至可以直接把我灭了。

不管要哪种对话框,以下两步必须得做:

1、在资源中(或者其他地方)添加一个Dialog资源;



图1. 新建对话框资源
2、右键 在【Add class 】,为你新建的对话框加新建一个类,为什么要添加类呢?因为面向对象编程,后续你要使用这个对话框,总得有个东西代表这个对话框吧!

图2中①处写对话框类的名称,一般以C****,代表类。

②处选择类的基类,我只选过CDialog和CDialogEx,后者是前者的派生,界面更美化了点。

③处世自动产生的两个关于这个类的文件。



图2. 添加对话框类
下一步就是如何调用?如何销毁?

对话框的调用。

模态:

CTestDlg d1; d1.DoModal();//推荐使用

两句就可以了,创建显示都自动完成。也可以用CTestDlg *d1=new CTestDlg;d1->DoModal();,但是要显示的在后面添加delete d1.

非模态:

CTestDlg *pDlg=new CTestDlg;

pDlg->Create(IDD_TESTDLG,this); 

pDlg->ShowWindow(SW_SHOW);

对于非模态对话框最好使用new创建对象,如果是直接创建一个局部对象,在函数结束时对话框就消失了,因为非模态对话框是一创建好就返回,而模态对话框是要等到关闭了对话框才返回,所以模态对话框可以使用局部对象。也可以采用全局对象来解决非模态对话框的作用域问题。

对话框的销毁

一个对话框关闭时,根据关闭的方法不同,会调用OnOK(刚开始创建对话框默认的【确定】按钮里面的调用的这个函数)或OnCancle(刚开始创建对话框默认的【取消】按钮里面的调用的这个函数)或者OnClose(右上角的×),然后会调用OnDestroy()——OnNcDestroy()——PostNcDestroy(),完全结束。

关闭模态对话框,只需要使用默认的函数就能正常关闭。删除动态创建的对象就像上面下划线标记即可。

MFC应用程序中关闭模式对话框的顺序

1.OnClose()        消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用

2.OnKillFocus()    消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送

3.OnDestroy()      消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

4.OnNcDestroy()    消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送

5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用

对于非模态对话框,新添加的对话框类必须重载 OnCancel() 和 PostNcDestroy()函数。

缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用DestroyWindow来关闭对话框。在OnCancel()函数中删除原来的,重新添加DestroyWindow();。

在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作。在PostNcDestroy()
函数的代码中添加delete this

MFC应用程序关闭窗口的顺序(非模态窗口)

1.OnClose()       消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息

2.OnDestroy()     消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息

3.OnNcDestroy()   消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息

4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用

注意:如果一个对话框还有一个子对话框,那就更要注意了。如果子对话框还在显示的时候,父对话框由于某种原因关闭了(如从其他线程接收到了WM_CLOSE消息),父对话框在执行完OnClose函数后会等待,直到子对话框销毁了,才会继续执行自己的如第一段所说的关闭过程。所以如果子对话框使用的是指针并且父窗口被先关闭了,就要在OnClose()后面执行的函数(比如PostNcDestroy())中delete了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: