一个窗口A继承自CFrameWnd,该窗口调用MessageBox打开一个消息框,然后调用A的DestroyWindow,程序就崩溃了,请问什么原因,如何解决

解决方案 »

  1.   

    调用::MessageBox试下吧,把HWND hWnd参数传NULL试下。
    如果直接调用CWnd::MessageBox的话弹出窗口的父窗口就是你的CFrameWnd,所以会有问题。
      

  2.   

    DestroyWindow
    应该是
    PostMessage(WM_CLOSE, 0, 0);
      

  3.   

    问:A窗口在哪里调用MessageBox打开一个消息框
    A的DestroyWindow又是在哪里调用的
      

  4.   

    具体是MessageBox阻塞了窗口,还是窗口怎么退出..
      

  5.   

    AfxMessageBox,你的叙述不是很清楚
      

  6.   

    PostMessage(WM_CLOSE, 0, 0); 
      

  7.   

    我来详细描述一下
    1、主窗体是一个SDI窗体
    2、新写一个CTestWnd,继承自CFrameWnd
    3、CMainFrame的成员变量m_pTestWnd,OnCreate时予以创建
    m_pTestWnd = new CTestWnd;
    m_pTestWnd->Create(NULL, "TEST");
    并且予以ShowWindow
    4、点击CTestWnd上某个按钮,该按钮处理函数调用了MessageBox("test");
    5、CMainFram处理菜单注销按钮,该按钮的处理函数调用m_pTestWnd->DestroyWindow();
    6、程序异常退出如果MessageBox关掉的话,则第六步的不幸就不会发生
      

  8.   

    我觉得问题归根到底不是在你的MessageBox上,应该是你非模态窗口的释放上有问题。好好在看看你处理释放的代码
      

  9.   

    文档—视图架构的类对象都是动态创建的,在销毁窗口时会自动delete this,而MessageBox是在消息响应函数中创建的,当MessageBox返回后,还要访问窗口类对象,而此时对象已经释放了,所以会产生异常。
      

  10.   

    请问:“当MessageBox返回后,还要访问窗口类对象”。。
    还要访问窗口类对象干什么的啊?
      

  11.   

    当点击CTestWnd上某个按钮时貌似是这样:void CTestWnd::onButtonclick()
    {AfxMessagebox("Hello", ID_OK);//CTestWnd被 postMessage(WM_CLOCE,0,0);了,这时CTestWnd窗口对象被释放
    //AfxMessagebox后面对窗口操作的代码会异常。
    }
      

  12.   


    继承自CFrameWnd的对象在PostNCDestroy的时候的确会delete this;,但在这之前会先销毁自己创建的所有child window,我认为MessageBox出的这个对话框应该也是其Child,照理说不应该异常。有什么解决办法吗?
      

  13.   

    楼主主要是因为MessageBox作为了窗口A的子窗口,强行退出模式窗口A引发的异常,可以参考下面的方法:
    用全局的MessageBox也即::MessageBox同时指定一个拥有MessageBox的窗口句柄,或者设置成NULL,默认为桌面拥有。
      

  14.   

    child window是具有WS_CHILD风格的窗口,MessageBox是popup window,不是child window,所以不会自动销毁。