模态窗口与非模态窗口销毁方法
来源:互联网 发布:手机jar软件下载 编辑:程序博客网 时间:2024/05/20 11:46
前几天发现自己的程序中使用非模态对话框,Debug版本有警告提示如下:
Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called
由于是Warnning,就没有太在意,后来随意上网一找发现,这个问题还是很严重的问题。
最后,发现有些基本问题我还没有搞清楚。同时在这个过程中,也学习了不少新东西,网上关于这个问题的资料很多,感觉真正把问题讲清楚的不多。今天我就来个总结,同时,也把网上有些人的疑问给解答下,更重要的是自己以后忘记了,可以回来参考。
先说下模式对话框调用的原则。(就是一定要先关了这个对话框才能操作后面窗口的对话框)
在模式对话框下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()关闭对话框。
一定要注意之前的CDialog::(当然,你可以重载你自己对话框的这个虚函数,但是,后面必须调用基类的CDialog::)
具体我们再参照深入浅出的风格,来个解刨。
CDialog::Close()默认调用CDialog::OnCancel() , CDialog::OnCancel()调用CDialog::EndDialog(IDCANCEL);
CDialog::EndDialog调用CDialog::DestroyWindows(),CDialog::DestroyWindows调用CDialog::OnDestroy() ;
CDialog::OnOK()默认先CDialog::UpdateData(),然后再调用CDialog::EndDialog(IDOK).
CDialog::EndDialog调用CDialog::DestroyWindows(), CDialog::DestroyWindows调用CDialog::OnDestroy()
看来上面你可能就知道了如下的等式
CDialog::Close() == CDialog::OnCancel() == CDialog::EndDialog(IDCANCEL)一样。
CDialog::OnOK() == CDialog::EndDialog(IDOK).
而CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的区别就是,少了一个CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在关闭对话框后,会把对话框上控件关联的变量的值更新为用户最后输入的值。而CDialog::EndDialog(IDCANCEL)就不会更新这个值。
希望自己把模式对话框的关闭讲清楚了。
下面说说非模态对话框。
调用原则是:
在无模式对话框,重载你自己的OnOK(),就是CMyDialog::OnOK(),然后在函数里调用CDialog::DestroyWindows()。注意:不是默认的CDialog::OnOK()来关闭对话框。
重载CMyDialog::OnCancel(),然后在函数里调用CDialog::DestroyWindows()。注意:不是调用默认的CDialog::OnCancel(),来关闭对话框。
听起来很简单,但是下面提到一个很具体的编程问题。
一般,我们用非模态对话框都是全局的,也就是通过new来创建,是在heap上的,而不是在stack上的。
这样我们当然还要通过delete 来销毁对象,不然可是有内存泄漏的。那么我们什么时候delete这个对象呢?
在msdn上面我们可以看到微软提供的方法是,
我们要重载PostNcDestroy(),即我们要实现CMyDialog::PostNcDestroy(),内容如下
CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }
这样的话,我们的类就会Auto-Cleanup了。
- 模态窗口与非模态窗口销毁方法
- 模态窗口与非模态窗口销毁方法
- Qt5窗口关闭与窗口销毁
- 销毁窗口
- 模态窗口与非模态窗口
- 创建模态窗口与非模态窗口
- 【销毁窗口】关键消息和方法
- 模态窗口与非模态窗口的区别
- MFC非模态窗口的销毁过程
- 非模态窗口的创建和销毁
- MFC窗口销毁过程
- MFC窗口销毁过程
- MFC窗口销毁过程
- MFC窗口销毁过程
- MFC 窗口销毁过程
- TN017:销毁窗口对象
- MFC窗口销毁过程
- 关于窗口的销毁
- 在 Fedora 7 上安装基于 Lighttpd 的 PHP5 And MySQL(转载自:PHP5研究室)
- c#(asp.net)几个不同从前台页面操作后台
- 在ASP.NET AJAX Control Toolkit 1.0中使用GB2312的编码时出现乱码的两种解决方案
- MFC中图形插件的插入问题
- XP 32位与64位的区别
- 模态窗口与非模态窗口销毁方法
- DOS命令(上)
- 程序设计2
- DOS命令(下)
- Asp.net学习笔记篇一
- unsigned char与char的区别
- CSS固定表头源码
- java输出万年历
- 用完成端口开发大响应规模的Winsock应用程序