关闭对话框
来源:互联网 发布:初中生网络兼职 编辑:程序博客网 时间:2024/05/18 15:07
当用户选择有模式对话框中的一个按钮(通常为“确定”或“取消”按钮)时,有模式对话框将关闭。
选择“确定”或“取消”按钮会使 Windows 将含有按钮 ID(IDOK 或 IDCANCEL)的 BN_CLICKED 控件通知消息发送给对话框对象。
CDialog 为这些消息提供默认处理函数:OnOK 和 OnCancel。默认处理程序调用 EndDialog 成员函数以关闭对话框窗口。
您还可以从自己的代码调用 EndDialog。
有关更多信息,请参见“MFC 参考”中 CDialog 类的 EndDialog 成员函数。
若要安排无模式对话框的关闭和删除,请重写 PostNcDestroy 并在 this 指针中调用 delete 运算符。
销毁对话框解释下一步将要进行的操作
总结:MFC中一个对话框的关闭过程 .
这里要说的是,模态对话框的消息循环要到调用了PostNcDestroy之后才真正的结束,即ContinueModal循环在这里才结束,然后类的析构函数将被调用,这个对话框才真正的被销毁了。
如果一个模态对话框还有一个模态的子对话框,那就更要注意了。如果子对话框还在显示的时候,父对话框由于某种原因关闭了(如从其他线程接收到了WM_CLOSE消息),父对话框在执行完OnClose函数后会等到,直到子对话框销毁了,才会继续执行自己的如第一段所说的关闭过程。
今天遇到的问题就是父对话框中保存子对话框的指针,为了让主对话框在关闭的时候先关闭所有的子窗口,在父对话框的OnClose里调用了delete pDlgChld,结果程序直接崩溃。后来改成先给子对话框发一个WM_CLOSE消息再delete,还是崩溃,又试了发WM_DESTROY、调子对话框的DestroyWindows,都不行。 看了上面的说明这里应该很清楚了,程序处理完这些消息后子对话框还在继续它的ModalLoop,这时候要delete对象肯定就会导致崩溃了。
解决办法其实很简单,把对子对话框指针的delete移到OnClose之后的任意一个函数中,这样就不会导致崩溃。因为父对话框在执行完OnClose后会等待直到它的子对话框结束,执行到OnClose之后的函数里时子对话框的生命期已经结束了,这时删除指针就不会有任何问题。
其实我们最好不要改变MFC对这套机制的处理,这样对资源的管理也是最合理的。
- 关闭对话框
- 关闭对话框
- 关闭对话框
- swt 关闭对话框 关闭dialog
- 定时关闭各种对话框
- 自动关闭的对话框
- SWT对话框自动关闭
- 自动关闭MessageBox()对话框
- 模式对话框关闭时
- 自动关闭MessageBox()对话框
- C#自动关闭对话框
- 自动关闭对话框
- 自动关闭MessageBox对话框
- 控制对话框的关闭
- Android 延迟关闭对话框
- MFC对话框关闭
- 关闭对话框的方法
- C#如何关闭对话框
- IOS面经系列(三)常用的framework第三方库ASIHTTPRequest简介
- 用wget直接下载oracle java jdk (7u45)
- Linux查看端口使用状态、关闭端口方法
- 如何使用“没有公钥,无法验证签名“的软件源
- 基于visual Studio2013解决面试题之0301累加
- 关闭对话框
- ARC开启的情况下是否需要对GCD对象dispatch_release ?
- 运营商路由器和交换机市场今年有望达202亿美元
- (转)cocos2d-x学习笔记09:动作2:持续动作
- 用Delphi编写蠕虫病毒浅析(安全小组必看)
- 在单线程模型中Message、Handler、MessageQueue、Looper之间的关系
- 《30天自制操作系统》学习笔记--Mac下工具的使用
- 输入公历得到农历
- Android音频系统之AudioFlinger(一)