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

  • 相关阅读:
    Windows Server 2012配置开机启动项
    Windows Server 2019 SSH Server
    NOIP2017 senior A 模拟赛 7.7 T1 棋盘
    Noip 2015 senior 复赛 Day2 子串
    Noip 2015 senior复赛 题解
    Noip 2014 senior Day2 解方程(equation)
    Noip 2014 senior Day2 寻找道路(road)
    Noip 2014 senior Day2 无线网络发射器选址(wireless)
    Noip2014senior复赛 飞扬的小鸟
    Noip 2014 senior 复赛 联合权值(link)
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693663.html
Copyright © 2011-2022 走看看