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

说起来挺简单的,一个对话框关闭时要依次调用该类的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对这套机制的处理,这样对资源的管理也是最合理的。

时间: 2024-12-21 05:57:28

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

mfc对话框-MFC中向导对话框中单选按钮的问题

问题描述 MFC中向导对话框中单选按钮的问题 我给单选按钮RADIO1建立类向导之后,BN_CLICKED函数里面应该怎么定义才能使单选按钮选择之后再次选择之后还是可以选择的,我现在的是点了单选按钮就不能再次点击了,,.另外怎么设置是只有选择单选按钮之后才能点击下一步?求解 解决方案 MFC单选按钮的分组问题MFC单选按钮MFC单选按钮 解决方案二: http://blog.csdn.net/zssureqh/article/details/7604018 解决方案三: 一个Group组中. 你

图片-JAVA在当前程序界面上显示出一个对话框,关闭后当前程序界面乱了。

问题描述 JAVA在当前程序界面上显示出一个对话框,关闭后当前程序界面乱了. 这是刚运行后的界面点击确定后成这样了 刚下面的回答看不懂啊 我新手. 圈着的是那个弹出对话框的的代码..放到RigisterFrame注册界面内的. 解决方案 好像没有设定页面刷新吧.错误提示代码以后,加个页面刷新试试. 解决方案二: //a代表教徒,b代表非教徒 public class Test { /** Enter Content. @author zhangjing @date 2015-5-19 @para

用mfc编写一个对话框能实现“打开指定文件,并显示出文件里的内容”这个功能吗?

问题描述 用mfc编写一个对话框能实现"打开指定文件,并显示出文件里的内容"这个功能吗? 用mfc编写一个对话框能实现"打开指定文件,并显示出文件里的内容"这个功能吗? 解决方案 用CFileDialog选择文件,然后CFile等读取文件内容,显示 解决方案二: MFC打开文件对话框功能实现 解决方案三: CFileDialog打开文件对话框,CFile类操作文件,CFile::GetLength()获取文件长度信息.

MFC中改变对话框背景的几个消息函数OnEraseBkgnd、 OnPaint、 OnCtlColor的调用顺序

设置对话框背景颜色及背景图片可在OnCtlColor(),OnEraseBkgnd(),OnPaint()里设置,对话框初始化完毕,显示时调用OnSize()->OnEraseBkgnd(),->OnPaint()->OnCtlColor(), 若想改变对话框大小,比如全屏显示ShowWindow(SW_SHOWMAXIMIZED);UpdateWindow(); 其中 ShowWindow会调用OnSize()->OnEraseBkgnd(),         UpdateWin

在线等~vb.net中有没方法可以使MDI中打开一个窗体时关闭其他窗体

问题描述 不是手动一个个窗体Close方法而是打开一个窗体时``其他不活动的窗体全部关闭 解决方案 解决方案二:vb.net中一个CLOSE就关闭所有对象了,好像是foreachmdiinmdismdi.disposenext哈哈,自己去查下方法吧解决方案三:1.如果在打开一个窗口前关闭的话ForEachformAsFormInMdiChildrenform.Close()Next2.如果打开一个窗口后关闭其他不活动的DimactiveMdiAsForm=ActiveMdiChildForEac

mfc-MFC中一个关于异常的问题

问题描述 MFC中一个关于异常的问题 在VS中,为什么会让我这样写CATCH,中间的逗号是什么意思,没有的话就出错,说让我输入")" CATCH(CFileException,e) 解决方案 http://blog.chinaunix.net/uid-21411227-id-1826958.html 这里有详细一些的介绍,以及宏的定义. 注意区分作为C++语法的try catch和MFC的宏TRY CATCH. 解决方案二: CATCH是MFC中的一个宏,在MFC诞生的时候,C++还很

mfc-VC中的MFC的基本对话框之间的调用如何始终保持一个对话框

问题描述 VC中的MFC的基本对话框之间的调用如何始终保持一个对话框 比如说两个对话框,现在对话框A中点击B按钮就弹出了B对话框,但是A对话框没有消失,AB对话框同时存在,如何实现弹出B对话框之后A对话框就自己退出.也就是说始终保持一个对话框 解决方案 你在打开B对话框后,OnOK()等让对话框A关闭 解决方案二: 如果你想做那种向导程序,可以参考:http://www.codeproject.com/Articles/567/Windows-Style-Wizards 解决方案三: 在B按钮中

visual studio 2010-VS2010 MFC一个自定义类如何调用一个对话框类中的成员变量

问题描述 VS2010 MFC一个自定义类如何调用一个对话框类中的成员变量 我从一个对话框定义了几个CString类型的edit控件,我现在写一个类想调用该对话框中的创建的edit控件变量.怎么办啊 解决方案 字符串: getdlgitem(id)->getwindowtext() 数字 getdlgitemid(id) 解决方案二: 把那个对话框的CString变量变成public的,然后就可以直接用了,当然你需要先知道你那个对话框的指针. 解决方案三: 黑马程序员---定义一个包含私有成员变

如何在vs中,做一个对话框,通过按钮调用或关闭“P2P远程协助文件传输SDK.exe”。

问题描述 如何在vs中,做一个对话框,通过按钮调用或关闭"P2P远程协助文件传输SDK.exe". 如何在vs中,做一个对话框,通过按钮调用或关闭"P2P远程协助文件传输SDK.exe". 解决方案 按钮响应事件函数中,CreateProcess,TerminateProcess来分别调用,关闭"P2P远程协助文件传输SDK.exe". 解决方案二: 你好大神.求具体的实现代码啊