我按照一个教程上讲的做的,是一个可以录入数据的对话框!在一个菜单选项的映射函数中,内容是这样的:
if(m_pRegisterDlg) m_pRegisterDlg->SetActiveWindow(); //激活对话框else 
{
//创建非模态对话框 m_pRegisterDlg = new CRegisterDialog(this); m_pRegisterDlg->Create(IDD_REGISTER,this);

}在执行的时候,那个对话框怎么也显示不出来,
可是我敲击键盘后发现虽然对话框没显示出来,可是已经可以录入数据了。我又在那个else里的最后加了一句:
m_pRegisterDlg->ShowWindow(SW_SHOW);执行的时候对话框到是显示出来了,也能录入数据,可是在关闭这个对话框,或者按下cancel后,vc就弹出了一个警告信息,说debug assertion failed!然后就退出了!我应该怎么办呢??????

解决方案 »

  1.   

    m_pRegisterDlg->ShowWindow(SW_SHOW);
    这句是必须有的,为什么会错就不知道了,没遇见过这种情况出错的!
      

  2.   

    把你的程序贴出来吧,就你这几句话是没问题的,m_pRegisterDlg->ShowWindow(SW_SHOW);肯定要加
      

  3.   

    if(m_pRegisterDlg)我觉得这一句应该改成
    if(m_pRegisterDlg->GetSafeHwnd())
    因为当m_pRegisterDlg成为野指针时,不为NULL,但并不指向对话框。
    而且对于非模态对话框,我们应该重载其OnOk()与OnCancel()并在其中调用
    DestroyWindow();使得退出对话框时,让对话框消毁。否则对话框只是不可见,但存在。
      

  4.   

    if(m_pRegisterDlg->GetSafeHwnd())前兄说得极是!
      

  5.   

    加个判断:
    if(m_pRegisterDlg->GetSafeHwnd())
      

  6.   

    呵,谢谢zswzwy(←圣骑士!帕迪拉斯!) 老兄。
    上月zswzwy(←圣骑士!帕迪拉斯!) 兄得了4千零。真是值得祝贺!
      

  7.   

    if(m_pRegisterDlg)我觉得这一句应该改成
    if(m_pRegisterDlg->GetSafeHwnd())
    因为当m_pRegisterDlg成为野指针时,不为NULL,但并不指向对话框。
    而且对于非模态对话框,我们应该重载其OnOk()与OnCancel()并在其中调用
    DestroyWindow();使得退出对话框时,让对话框消毁。否则对话框只是不可见,但存在。值得学习
      

  8.   

    你对变量m_pRegisterDlg使用New分配动态内存后,在销毁窗口时有没有把他释放掉(即用Delete操作符)清理,若你没用delete的话不但会有你说的错误,而且你想再次打开对话框是不可能的
      

  9.   

    感谢楼上的各位先!
    谢谢!!
    我把
    OnCancel里的CDialog::OnCancel();和
    PostNcDestroy()里的CDialog::PostNcDestroy();
    给注释掉,程序就没事了。可这两句话不是我加的呀!
    应该是class wizard加上去的吧?这两句话在原来有什么用吗?注释掉不会出什么问题吧!??谢谢!
      

  10.   

    villagehead(村长) 怎么联系你  我有事情请教
      

  11.   

    请教:
    当删除了一次后,再次打开这个非模态对话框时:
    还是进入了这个判断中!if(m_pRegisterDlg->GetSafeHwnd())
    因为当m_pRegisterDlg成为野指针时,不为NULL,但并不指向对话框。hWnd = 0xdddddddd
    因此报错!
      

  12.   

    CXXX  *p = new CXXX();
        BOOL bCreateResult;
            if(!p->GetSafeHwnd()) 
    {
                //IDD_MY_DIALOG 为你写的dialog的资源
                bCreateResult = p->Create(IDD_YOURDLG, this);
            p->ShowWindow(SW_SHOW);
    }
            else
    {
                bCreateResult = TRUE;
    }这样写试试
      

  13.   

    在OnCancel()中
    CDialog::OnCancel();
    DestroyWindow(); //加入的代码
      

  14.   

    在PostNcDestroy()中加 delete this 可否
      

  15.   

    当删除了一次后,再次打开这个非模态对话框时:
    还是进入了这个判断中!删除之后将pRegisterDlg的m_hwnd赋值为NULL或者改用
    HWND hwnd = m_pRegisterDlg->GetSafeHwnd();
    if(hwnd && ::IsWindow(hwnd))