高手救命:建立一个非模式对话框,当对话框不为当前窗口时让它自行销毁。然后按一下自己设定的某个按键,重新建立一个窗口,结果出错。示源码;
在主窗口头文件的定义中加入
public:
MenuSet *m_MenuSet;按设定的按键处理:
if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
else
     {
//创建非模态对话框
m_MenuSet=new MenuSet(this);
m_MenuSet->Create(IDD_DIALOG1,this);
      }
::GetWindowRect(m_MenuSet->m_hWnd,&dlgsize);
m_MenuSet->ShowWindow(SW_SHOWNORMAL);
::SetWindowPos(m_MenuSet->m_hWnd,HWND_TOPMOST,tt.x,tt.y,dlgsize.right-dlgsize.left,dlgsize.bottom-dlgsize.top,SWP_SHOWWINDOW);在对话框的消息处理中,当对话框不为当前窗口时让它自行销毁:
LRESULT MenuSet::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
// TODO: Add your specialized code here and/or call the base class
  if(message==134 && wParam==0 && lParam==0) DestroyWindow();
  return CDialog::WindowProc(message, wParam, lParam);
}结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"

解决方案 »

  1.   

    关闭对话框:
    其实,一般窗口的销毁可以用DestoryWindow(),对话框的销毁可以用EndDialiog().
    EndDialog(IDOK);
    DoModal()的返回值为IDOK,但不会执行用户定义的OnOK.
    只要发送WM_CLOSE消息,就会有响应的函数处理的。
    SendMessage(WM_CLOSE);
    PostMessage(WM_CLOSE);void CTestDialog::OnButton1() 
    {
    GetParent()->DestroyWindow();
    }
    窗口和对话框一起关
    PostMessage(WM_QUIT);
    SendMessage(WM_QUIT);//不行
    无模式对话框用DestroyWindow();
    用EndDialog
    你再打开原对话框就有问题
    无模式对话框
    的OnOK,OnCance
    都要重载
      

  2.   

    SendMessage(WM_CLOSE)只是关闭对话框,并不能彻底删除销毁掉,而且我要在非模式对话框内部把它销毁。应该怎么做?
      

  3.   


    if(message==134 && wParam==0 && lParam==0)
    {
    DestroyWindow();
    return TRUE;
    }
      

  4.   

    还是不行,怎么办?烦死人了,搞不懂.
    我不是已经把对话框用 DESTROYWINDOW() 删除掉了吗?为什么结果错误:“0x00483e6e”指令引用的"0xddddde81"内存,该内存不能为"READ"
      

  5.   

    补充一下:我把非模式对话框DESTORYWINDOW()之后,按一下某个按键,还要重新建立这么个窗口.
      

  6.   

    是不是这句出问题了?
    if(m_MenuSet) m_MenuSet->SetActiveWindow(); //激活对话框
    你销毁对话框后并没有delete menuSet以及置menuSet为Null,所以下次按键时还是会调用SetActiveWindow(),但是这个窗口已经被销毁了,所以出错了?
      

  7.   

    同意小小的意见。虽然对话框窗口已经销毁,但是,标识对话框的指针值没有给NULL,所以,下次按键时,仍然会调用SetActiveWindow(),但是窗口已经销毁了,所以不能显示出现,并出错,要在DestroyWindow后将指针置NULL
      

  8.   

    我在非模式对话框类中的
    void MenuSet::PostNcDestroy() 
    {
    // TODO: Add your specialized code here and/or call the base class
    delete this; //删除对话框对象
    CDialog::PostNcDestroy();
    }因此当再次调用时,m_MenuSet应该为NULL
      

  9.   

    哈哈void MenuSet::PostNcDestroy() 
    {
    // TODO: Add your specialized code here and/or call the base class
    delete this; //删除对话框对象
    CDialog::PostNcDestroy();
    }
    好象有问题啊自己内部DELETE自己?
    不行吧
      

  10.   

    我是参考书上的例子,应该不会错的,这里主要是当调用DestroyWindow()对话框类时删除对话框,
      

  11.   

    我也怀疑是“if(m_MenuSet) m_MenuSet->SetActiveWindow(); ”里面有问题,试试
    if (IsWindow(m_MenuSet->m_hWnd)) m_MenuSet->SetActiveWindow(); 
    else{...}