博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]模态对话框与非模态对话的几种销毁方法与区别
阅读量:6272 次
发布时间:2019-06-22

本文共 1837 字,大约阅读时间需要 6 分钟。

 

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

【参考资料 感谢作者】

1、

 

转载地址:http://rplpa.baihongyu.com/

你可能感兴趣的文章
Oracle DB_LINK如何使用
查看>>
cv resource
查看>>
关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用
查看>>
JDK源代码学习系列07----Stack
查看>>
firefox
查看>>
PS批处理的使用
查看>>
七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 【转】
查看>>
Quartz作业调度框架
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
js-权威指南学习笔记13
查看>>
《超级时间整理术》晨读笔记
查看>>
Spring Boot 2.0(二):Spring Boot 2.0尝鲜-动态 Banner
查看>>
Delphi IdTCPClient IdTCPServer 点对点传送文件
查看>>
Delphi中使用ActiveX的一些心得
查看>>
QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)
查看>>
(原創) C/C++的function prototype和header file (C/C++) (C)
查看>>
深入理解JavaScript系列(29):设计模式之装饰者模式
查看>>
程序员的罪与罚
查看>>
SQL*LOADER错误总结
查看>>
SQL日志收缩
查看>>