zoukankan      html  css  js  c++  java
  • 模态对话框与非模态对话的几种销毁方法与区别

    自己看了这篇文,觉得很好,所以转了过来,大家共享,其实在msdn中输入destroying windows搜索,就可以发现

    Called by the default OnNcDestroy member function after the window has been destroyed.(PostNcDestroy( )在窗口销毁后被OnNcDestroy成员函数调用,所以可以在PostNcDestroy( )中释放资源)

     
    virtual void PostNcDestroy( );

    Collapse imageRemarks

    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

  • 相关阅读:
    鼠标放大镜案例代码
    鼠标点击跟随,鼠标点击哪里,图片跟随到哪里;
    筋斗云效果(云朵在导航栏内随着鼠标移动)
    HDU5003:Osu!(签到题)HDU5038:(签到题,题意很坑)
    SDUT3146:Integer division 2(整数划分区间dp)
    SDUT3145:Integer division 1(换零钱背包)
    SDUT3143:Combinatorial mathematics(组合数学)
    SDUT3141:Count(哈希)好题
    SDUT1574:组合数的计算
    SDUT1607:Number Sequence(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693663.html
Copyright © 2011-2022 走看看