总结:MFC中一个对话框的关闭过程 .
2016-02-24 11:32
288 查看
说起来挺简单的,一个对话框关闭时要依次调用该类的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对这套机制的处理,这样对资源的管理也是最合理的。
分类: VC/MFC
这里要说的是,模态对话框的消息循环要到调用了PostNcDestroy之后才真正的结束,即ContinueModal循环在这里才结束,然后类的析构函数将被调用,这个对话框才真正的被销毁了。
如果一个模态对话框还有一个模态的子对话框,那就更要注意了。如果子对话框还在显示的时候,父对话框由于某种原因关闭了(如从其他线程接收到了WM_CLOSE消息),父对话框在执行完OnClose函数后会等到,直到子对话框销毁了,才会继续执行自己的如第一段所说的关闭过程。
今天遇到的问题就是父对话框中保存子对话框的指针,为了让主对话框在关闭的时候先关闭所有的子窗口,在父对话框的OnClose里调用了delete pDlgChld,结果程序直接崩溃。后来改成先给子对话框发一个WM_CLOSE消息再delete,还是崩溃,又试了发WM_DESTROY、调子对话框的DestroyWindows,都不行。 看了上面的说明这里应该很清楚了,程序处理完这些消息后子对话框还在继续它的ModalLoop,这时候要delete对象肯定就会导致崩溃了。
解决办法其实很简单,把对子对话框指针的delete移到OnClose之后的任意一个函数中,这样就不会导致崩溃。因为父对话框在执行完OnClose后会等待直到它的子对话框结束,执行到OnClose之后的函数里时子对话框的生命期已经结束了,这时删除指针就不会有任何问题。
其实我们最好不要改变MFC对这套机制的处理,这样对资源的管理也是最合理的。
分类: VC/MFC
相关文章推荐
- 阿里云云主机Ubuntu14.04.2升级系统内核到3.19
- 阿里云云主机Ubuntu14.04.2升级系统内核到3.19
- 二叉树 之 寻找某个结点所有的祖先
- 【SPOJ-MGAME1】Game【博弈DP】
- How to deal with Robot Framework result from XML output
- MySQL数据库事务隔离级别(Transaction Isolation Level)(顶)
- 源码收集
- vb document.execCommand()语法格…
- 淘宝客搜索链接组成详解
- 惊奇发现百度首页用户体验提升
- 我的网站搬家技巧汇总
- 中国人要学会捍卫自己和国家的荣誉
- linux web服务器必须正确配置php-f…
- win7/windows7内录方法
- MS SQLSERVER如何实现跨服务器查询
- 夏天高温四十度最惨的事情是什么?
- 2012年08月22日
- SQL SERVER传递datetime参数注意事…
- jQuery UI 实现图片循环显示,常用于网站首页banner广告切换
- 给UIWebView对象添加自定义的头视图或者尾视图