对话框关闭时,框架回调用OnNcDestroy,OnNcDestroy会调用虚函数PostNcDestroy,在你的类中重载PostNcDestroy,在其中加入delete this就可以自动清除了.
如果不重载PostNcDestroy,也可以delete显式删除,但因为是非模态对话框,不容易知道其窗口是否已destory,所以最好还是用自动清除的方法

解决方案 »

  1.   

    一律用delete显式删除完全可以,但一般要在Dialog中给程序发送一个对话框完成的消息。
      

  2.   

    非模式对话框用隐式删除比较好,delete也行。
      

  3.   

    你可以自己从CDialog建立一个通用的非模式对话框类。在构造函数里加入一个参数
    如:
    class CModelessDlg:public CDailog
    {
    public:
       CModelessDlg(UINT uIDD,CDialog ** ppThis,CWnd * pParent=NULL);
       //....
    protected:
       CDialog ** m_ppThis;
    };CModelessDlg::PostNcDestroy()
    {
      if(m_ppThis)
        *m_ppThis=NULL;
      delete this;
      CDialog::PostNcDestroy();
    }
    这样你在外面建立一个非模式对话框时就可以从这个类继承实现。
    如:class CYourDlg:public CModelessDlg
    {
    CYourDlg(CDialog ** ppThis,CWnd* pParent=NULL);
    };CYourDlg::CYourDlg(CDialog ** ppThis,CWnd* pParent):
    CModelessDlg(CYourDlg::IDD,ppThis,pParent)
    {//...
    }CYourDlg * m_pDlg=new CYourDlg(&m_pDlg);
     m_pDlg->Create(); 
    //   ....
     if(m_pDlg)
        m_pDlg->DestroyWindow();如果你在一个程序里生成了一个非模式对话框,而没有显示地删除,在程序退出时系统会发送退出消息给这个对话框。一般情况下,你可以用DestroyWindow代替delete删除该对话框,这样做似乎更加符合Windows的消息机制