模态对话框与非模态对话的几种销毁方法与区别

From: http://renjwjx.blog.51cto.com/811549/191320/


前几天发现自己的程序中使用非模态对话框,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了。

 

msdn的建议,英文的,当初我看了2遍没看懂。现在在回头去看,才发现比较简单。但让现在你看了这篇blog后就不用看这个了。

http://msdn.microsoft.com/en-us/library/5zba4hah.aspx


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

处理问题的方式

1. 测试代码的时候,如果某段代码效率特别差,可以通过注释部分代码的方式以确定问题代码的位置。测试的时候一定保证只有一部分代码在执行,排除其他干扰。 2. 日志记录: 1). 要有详细的日志记录,方便出错时查找。 2). 在…

常用软件

1. vim安装wget ftp://ftp.vim.org/pub/vim/unix/vim-7.2.tar.bz2解压tar.bz2文件tar -xjf vim-7.2.tar.bz2./configure --prefix/usr/soft_install/make && make install2. src.rpm安装方法1:Redhat 9或mandrake 9以上#rpmbuild --rebuild XXXX.src.rpm方法2:#rpm --r…

jvm 堆 比例_JVM调优原则

JVM调优原则调优目标将进入老年代的对象数量降到最低减少 Full GC 的执行时间在同样场景下,采用多个机器上进行参数调整后的比较验证,将验证能够提高性能的参数应用到最终所有服务器上。一般常规满足下列不需要优化Minor GC执行时间不到50ms;…

sublime的使用

sublime text3实用教程-安装js智能提示插件 sublime text 3/2怎么卸载删除插件

Linux主机硬盘的主要规划

系统对于硬盘的需求跟刚刚提到的主机开放的服务有关,那么除了这点之外,还有没有其他的注意事项?当然有,那就是数据的分类与数据安全性的考虑,即当主机系统的硬件出现问题时,你的档案数据能否安全的保存。 前…

64位虚拟机下asm()语法_用Hyper-V在win10中创建虚拟机,简单快捷,不用安装其它软件...

运行虚拟机是使用操作系统的好方法,因为无需在电脑上安装它,例如,你可以毫无风险地试用最新的Windows 10试用版或新的Ubuntu(Linux)发行版。以下是如何在Windows 10中创建虚拟机的方法。认识Windows 10中的Hyper-V微软提供了一个称为Hyper-V的…

Eclipse快捷键大全

终结技:CtrlShiftL 显示所有快捷键Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行…

判断一个Checkbox是否被选中

环境:Win XP VC2010 MFC对话框程序 在窗口添加一个checkbox,其ID为:ID_CHECK1,添加其点击事件: void CWorkHelperDlg::OnBnClickedCheck1() {CButton *pCheckbox (CButton*)GetDlgItem(IDC_CHECK1);if(pCheckbox-&…

微信公众平台 分享到朋友圈 js代码

前言:1目前必须是被微信认证过的公众平台才能使用此接口 1.绑定域名 2.引用文件 http://res.wx.qq.com/open/js/jweixin-1.0.0.js 3配置前台js配置 var url location.href.split(#)[0]; wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端…

献给那些离婚或准备离婚的人

这天,白云酒楼里来了两位客人,一男一女,四十岁上下,穿着不俗,男的还拎着一个旅行包,看样子是一对出来旅游的夫妻。服务员笑吟吟地送上菜单。男的接过菜单直接递女的,说:“你点吧&…

VC编辑框(EDIT)的自动换行、自动滚屏 、到指定行数自动清空

From: http://getyoureyes.blog.163.com/blog/static/101716622201083081914305/ 经过多次测试,总结出VC编辑框(EDIT)的自动换行与自动滚屏的方法。 方法一:(当EDIT映射到一CString时) m_String m_Strin…

测试晶面间距软件_纳米材料粒度测试方法大全

纳米材料是指三维空间尺寸中至少有一维处于纳米数量级 (1~100 nm),或由纳米结构单元组成的具有特殊性质的材料,被誉为“21世纪最重要的战略性高技术材料之一”。当材料的粒度大小达到纳米尺度时,将具有传统微米级尺度材料所不具备的小尺寸效应…

第三方控件

1. Fileitem接口 FileItem是一个接口,处理表单内容以及文件内容的的方法。在应用过程中,每一个表单中的单个字段袁术,都会被封装成一个FileItme类的对象,通过调用FileItem对象的相关方法可以得到相关表单字段元素的数据。 FileIte…

如何使用 SSH 控制连接 Windows 服务器

服务器远程连接/ssh方式连接教程(windows云主机远程登录) 如何使用 SSH 控制连接 Windows 服务器

CDHtmlDialog 与 网页交互技巧

From: http://blog.csdn.net/catxl313/article/details/2204541 CDHtmlDialog可以方便的将网页嵌入对话框,使得在程序设计中人机界面(DHTML网页)与控制逻辑(CDialog)可以很好的分离,下面是一些实用技术与技…

查看NTFS文件系统版本号

fsutil fsinfo ntfsinfo c:转载于:https://blog.51cto.com/liushen/269304

java 盘符 系统_001-Java再回首开篇-入门基础

来我们一起了解下java背景突然想着, 整理一套从基础开始的文章吧,对自己来讲是回顾基础和复习,对他人来讲,能有一点点绵薄的帮助,我也是很欣慰了呢,希望能帮你少走点弯路。自己整理的,如有勘误&…

[react] react的虚拟DOM和vue的虚拟DOM有什么区别?

[react] react的虚拟DOM和vue的虚拟DOM有什么区别? React 是数据先生成 vdom,然后对比 vdom(实现上并非先后顺序,两棵树边遍历边生成新的树),最后通过新的 DOM 树渲染。 Vue 是数据先进性对比,先…

( 设计高效算法 ) 年龄排序 Age Sort Uva 11462

( 设计高效算法 ) 年龄排序 Age Sort Uva 11462 可以使用整数排序法, 内存太小无法堆排序. #include <cstdio> #include <cstring> using namespace std;int main(){unsigned int age[101];int n,temp;while (scanf("%d", &n) 1 && n){mems…