各位大神,我在创建非模态对话框的时候,为什么第二次打开会出现错误。void CWHView::OnDialog() 
{
// TODO: Add your command handler code here Dlg.Create(IDD_DIALOG1,this);
Dlg.ShowWindow(SW_SHOW);
}CTestDlg Dlg;  定义成全局变量;
CWHView::~CWHView()
{
Dlg.DestroyWindow();  析构函数销毁对话框
}
然后运行之后,第一次点开可以,但是第二次点开对话窗,就出现这个现象。Debug Assertion Failed!
Program:D:\MFC\WH\Debug\WH.exe
File: wicore.cpp
Line: 639For information on how your program can cause an assertin
failure,see the Visual C++ documentation on asserts.(Press Retry to debug the application)但是我用new就不会出现这种情况。CTestDlg *pDlg=new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
PDlg->ShowWindow(SW_SHOW);

解决方案 »

  1.   

    指针new之后本来就要手动释放的,你View析构的时候Dlg指针指向的那块内存还没释放,因此没问题。但是你CTestDlg Dlg这样申明就是实体对象,实体对象的生命周期在View析构的时候早就再见了,你再Destory的话就出问题了 
      

  2.   

    没有释放掉关联到dlg上的对话框资源。对话框类中添加重载函数OnOk(),OnCancel(),
    并添加代码一行代码销毁对话框资源DestroyWindow();比如这样写:
    void CDlgTest::OnOK()  
    {  
    DestroyWindow();  }  
      

  3.   

    这样不行啊。出现OnOk member function not declared in 'CTestDlg'
      

  4.   

    你重载一下这个函数,不是直接将上面的代码加进去。
    出现错误的原因是非模态对话框关闭时其实对话框并没有被销毁,而是隐藏了起来,所以你点第二次时就会出错。
    解决的方法是两个:第一个是我上面说的,在关闭时销毁它,你可以处理一个OnClose之类的函数,在里面用DestroyWindow();销毁窗口。
    第二个方法是不销毁,判断一下窗口是否存在,存在的话,显示它就行了。
    比如将创建代码写成这样:
    if(::IsWindow(m_dlg.m_hWnd))
    {
                   dlg.ShowWindow(SW_SHOW);
    }
    else
    {
    dlg.Create(IDD_DIALOG1);
    dlg.ShowWindow(SW_SHOW);
    }
      

  5.   

    俺没研究过机制,平常的时候在OnClose里面
    调用CDialog::OnClose();
    然后再delete this;