模态对话框与非模态对话的几种销毁方法与区别
2011-01-14 21:20
330 查看
自己看了这篇文,觉得很好,所以转了过来,大家共享,其实在msdn中输入destroying windows搜索,就可以发现
Called by the default OnNcDestroy member function after the window has been destroyed.(PostNcDestroy( )在窗口销毁后被OnNcDestroy成员函数调用,所以可以在PostNcDestroy( )中释放资源)
Derived classes can use this function for custom cleanup such as the deletion of the this pointer.
(派生类可以使用PostNcDestroy( )做一些自定义清理工作,如删除rhis指针)------>英语很烂,反正是这意思,嘿嘿,别拍砖。
/////////////////////////////////////////////转载的文如下/////////////////////////////////////////////////////////////////////////////
前几天发现自己的程序中使用非模态对话框,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
Called by the default OnNcDestroy member function after the window has been destroyed.(PostNcDestroy( )在窗口销毁后被OnNcDestroy成员函数调用,所以可以在PostNcDestroy( )中释放资源)
virtual void PostNcDestroy( ); |
![](ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vclib/local/collapse_all.gif)
Remarks
Derived classes can use this function for custom cleanup such as the deletion of the this pointer.(派生类可以使用PostNcDestroy( )做一些自定义清理工作,如删除rhis指针)------>英语很烂,反正是这意思,嘿嘿,别拍砖。
/////////////////////////////////////////////转载的文如下/////////////////////////////////////////////////////////////////////////////
前几天发现自己的程序中使用非模态对话框,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
相关文章推荐
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- [转]模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框的销毁过程与非模态对话的几种销毁方法
- 模态对话框与非模态对话的几种销毁方法与区别
- 模态对话框与非模态对话的几种销毁方法与区别
- MFC模态对话与非模态对话框
- MFC模态对话与非模态对话框
- MFC非模态对话框和模态对话框销毁的方法