总结:MFC中一个对话框的关闭过程 .

简介: 说起来挺简单的,一个对话框关闭时要依次调用该类的DestroyWindow-OnDestroy-PostNcDestroy,根据关闭的方法不同,在这些函数之前会调用OnOK、OnCancle或者OnClose。
说起来挺简单的,一个对话框关闭时要依次调用该类的DestroyWindow-OnDestroy-PostNcDestroy,根据关闭的方法不同,在这些函数之前会调用OnOK、OnCancle或者OnClose。

 

      这里要说的是,模态对话框的消息循环要到调用了PostNcDestroy之后才真正的结束,即ContinueModal循环在这里才结束,然后类的析构函数将被调用,这个对话框才真正的被销毁了。

 

      如果一个模态对话框还有一个模态的子对话框,那就更要注意了。如果子对话框还在显示的时候,父对话框由于某种原因关闭了(如从其他线程接收到了WM_CLOSE消息),父对话框在执行完OnClose函数后会等到,直到子对话框销毁了,才会继续执行自己的如第一段所说的关闭过程。

 

      今天遇到的问题就是父对话框中保存子对话框的指针,为了让主对话框在关闭的时候先关闭所有的子窗口,在父对话框的OnClose里调用了delete pDlgChld,结果程序直接崩溃。后来改成先给子对话框发一个WM_CLOSE消息再delete,还是崩溃,又试了发WM_DESTROY、调子对话框的DestroyWindows,都不行。 看了上面的说明这里应该很清楚了,程序处理完这些消息后子对话框还在继续它的ModalLoop,这时候要delete对象肯定就会导致崩溃了。

 

      解决办法其实很简单,把对子对话框指针的delete移到OnClose之后的任意一个函数中,这样就不会导致崩溃。因为父对话框在执行完OnClose后会等待直到它的子对话框结束,执行到OnClose之后的函数里时子对话框的生命期已经结束了,这时删除指针就不会有任何问题。

 

      其实我们最好不要改变MFC对这套机制的处理,这样对资源的管理也是最合理的。

目录
相关文章
|
2月前
MFC窗口创建机制
MFC窗口创建机制
10 0
|
3月前
MFC打开控制台的2种方式
MFC打开控制台的2种方式
|
4月前
[MFC] A对话框调用B对话框
[MFC] A对话框调用B对话框
17 0
|
10月前
|
程序员 Windows
【windows编程之对话框】对话框原理,对话框的创建
【windows编程之对话框】对话框原理,对话框的创建
|
测试技术 BI 区块链
MFC——对话框的创建及使用(上)
MFC——对话框的创建及使用
944 0
MFC——对话框的创建及使用(上)
|
数据安全/隐私保护
MFC——对话框的创建及使用(下)
MFC——对话框的创建及使用
196 0
MFC——对话框的创建及使用(下)
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
MFC学习——如何在MFC对话框中添加一个显示网页的窗口(用vs2017以下版本,vs2017不支持)
316 0
|
容器
对话框和窗口的区别
“窗口”与“对话框”有什么区别?                       计算机类稿件的一大特点是文中的图很多。在这大量的图中,系统软件或应用软件的“界面”、“窗口”、“对话框”、“提示框”等的截图又占了很大的比例。
4210 0
|
Windows
MFC中修改默认启动对话框方法
// CMyAppEApp 初始化BOOL CMyAppEApp::InitInstance(){// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControls()。
1364 0
|
安全 C#
WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口
原文:WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
1012 0