vc模态和非模态对话框关闭过程

非模态对话框相对于模态对话框,他的创建和销毁过程和模态对话框有一定的区别,非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。 还有一个必须重载的函数就是PostNcDestroy,这也是一个虚函数,通常的非模态对话框是用类的指针,通过new创建的,这就需要在PostNcDestroy函数中delete掉这个指针。 ### VC模态与非模态对话框关闭过程详解 #### 一、概述 在VC++中,模态对话框和非模态对话框是两种常用的交互界面形式。模态对话框在显示时会阻止用户与应用程序中的其他窗口进行交互,直到该对话框被关闭;而非模态对话框则不会阻止用户与其他窗口的交互。这两种对话框在创建、显示以及关闭过程中有所不同。本文主要探讨非模态对话框的创建和销毁过程。 #### 二、非模态对话框的创建与销毁 ##### 1. 创建过程 非模态对话框通常通过`new`操作符创建实例,并通过`Create()`方法来显示。例如: ```cpp CTestDlg* pDlg = new CTestDlg; pDlg->Create(IDD_TESTDLG, this); pDlg->ShowWindow(SW_SHOW); ``` 其中`CTestDlg`是继承自`CDialog`的类,而`IDD_TESTDLG`是指向资源ID的标识符,用于加载对话框模板。 ##### 2. 销毁过程 对于非模态对话框,需要重载两个重要的函数:`OnCancel()` 和 `PostNcDestroy()`。 - **OnCancel()**:当用户点击对话框上的“取消”按钮时,会触发`OnCancel()`函数。在这个函数中,我们需要调用`DestroyWindow()`来销毁对话框。注意不要调用基类`CDialog`中的`OnCancel()`函数,因为它会调用`EndDialog()`,这会导致对话框变得不可见但并没有真正销毁。 ```cpp void CTestDlg::OnCancel() { DestroyWindow(); } ``` - **PostNcDestroy()**:这是一个虚函数,主要用于非模态对话框的清理工作。由于非模态对话框通常是通过`new`创建的,因此需要在这个函数中释放内存。 ```cpp void CTestDlg::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; } ``` #### 三、消息处理流程 为了更好地理解非模态对话框的关闭机制,我们需要了解VC++中消息的处理流程。 1. **AfxWndProc()**:所有窗口的消息都会先经过这里,然后根据消息类型转发给相应的对象进行处理。 2. **AfxCallWndProc()**:将消息发送给具体的窗口类进行处理。 3. **WindowProc()**:窗口类的消息处理函数,它会根据消息类型调用不同的成员函数或默认处理函数。 4. **OnWndMsg()**:用于处理特定的消息,如`WM_COMMAND`等。如果未处理,则会调用`DefWindowProc()`。 5. **OnCommand()**:处理命令消息,如菜单项的选择或按钮的点击。 6. **OnCmdMsg()**:用于路由命令消息到正确的接收者。 7. **OnClose()**:处理`WM_CLOSE`消息,通常用于关闭对话框。 8. **OnDestroy()**:处理`WM_DESTROY`消息,在窗口即将被销毁时调用。 9. **OnNcDestroy()**:处理`WM_NCDESTROY`消息,在非客户区即将被销毁时调用。 #### 四、总结 非模态对话框的关闭涉及多个步骤,包括消息的传递、函数的重载以及资源的释放。为了确保非模态对话框能够正确地关闭并释放资源,开发者需要注意以下几点: - 重载`OnCancel()`并在其中调用`DestroyWindow()`来销毁对话框。 - 重载`PostNcDestroy()`并在其中释放对话框对象所占用的内存。 - 正确处理各种消息,以确保对话框的正常运行和关闭。 遵循这些规则可以有效地管理非模态对话框的生命周期,避免内存泄漏等问题。















先看一下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 CTestDlg;
pDlg->Create(IDD_TESTDLG,this);
pDlg->ShowWindow(SW_SHOW);
//对话框中:
void CTestDlg::OnCancel()
{
DestroyWindow();
}
void CTestDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;
}
如果要在点击按钮的情况下,销毁非模态对话框,只需要把按钮的事件映射到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)的过程中潜在的
传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该
类寻找一个消息处理函数
剩余5页未读,继续阅读

- 0心羽2015-09-23一般般,但学是有用处的
- shaoqinqixian2013-11-29还是得到了不少帮助,不错
- utral董东东2012-12-05下载后获得一些参考。感谢上传。
- fishinwater1232014-05-17代码蛮简单,但是谢谢上传。
- A1377504892013-07-18一般般,用处不大,还是感谢上传

- 粉丝: 484
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 《Python 深度学习》(Deep Learning with Python) 一书代码学习记录(附中文注释)
- 物联网产业的发展研究报告.docx
- 酒店开业筹备前计划及方案.doc
- 小班认识叶子教案.docx
- 幼儿园环境空间设计与行为心理分析.doc
- 一次料场混匀料场带式输送机技术协议集安佳信.doc
- [城市轨道交通运营管理课件]网络化运营内容补充.ppt
- 酒店工程部工作程序及要求.doc
- 正式员工劳动合同范本.doc
- 新版中班心理健康教案.doc
- 公关部-管理制度与工作内容.doc
- 混凝土道路常见问题及解决方案.doc
- 通信原理综合题型及答案-2.doc
- 美食文化节策划书.doc
- 透水混凝土分包合同.doc
- 操作风险管理知识自测题.doc


