模态://创建
CDialog dlg;
dlg.DoModal();
//销毁
dlg.EndDialog;非模态://创建
CDialog* pDlg=new CDialog;
pDlg->Create(...);
pDlg->ShowWindow();
//销毁
pDlg->DestroyWindow();
delete pDlg;MSDN很详细的了

解决方案 »

  1.   

    在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下: 
    void CTestDlg1::OnOK() 

    CDialog::OnOK(); 
    DestroyWindow(); 

    void CTestDlg1::OnCancel() 

    CDialog::OnCancel(); 
    DestroyWindow(); 

    void CTestDlg1::OnDestroy() //添加WM_DESTORY消息相应的函数

    CDialog::OnDestroy(); 
    AfxMessageBox("call delete this"); 
    delete this;            //这步要出错

    在网上看到最简单的方法,但为什么失败呢?根本不能delete自己啊
      

  2.   

    我试着把最后一句注释掉居然就成功了呀,难道是因为我建的对话框对象不是指针吗,可this就是指针啊。
      

  3.   

    为什么要delete this?
    C++基本的内存申请释放是怎么说的?
    你用了new在堆栈上动态申请了内存才用delete释放
    而你的Dialog是一个临时变量CAttributesDlg AtbDlg;
    掉用完后内存会被自动回收的,不用你操心。
    还有CDialog的OnOK已经把窗口销毁了,你再去调用DestroyWindow()销毁,是多此一举。
    MFC代码都是开源的,可以进去看看你就明白了。
      

  4.   

    结帖给分吧~~~~~~~~:如果采用非模态方式显示对话框,通常将此dlg变量声明为类的成员变量:
    private:
        CMyDialog m_dlg;
        //....在需要调用此窗口的地方使用IsWindow先判断再决定是否创建:
        if (!IsWindow(m_dlg.m_hWnd)) 
        {
            m_dlg.Create(IDD_MYDLG, NULL); //创建对话框
        }
        m_dlg.ShowWindow(SW_SHOW);//显示对话框