窗口打开的MessageBox未关闭的时候关闭该窗口异常退出

benbensan 2009-06-10 10:59:12
一个窗口A继承自CFrameWnd,该窗口调用MessageBox打开一个消息框,然后调用A的DestroyWindow,程序就崩溃了,请问什么原因,如何解决
...全文
124 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pysjp 2009-06-11
  • 打赏
  • 举报
回复
楼主主要是因为MessageBox作为了窗口A的子窗口,强行退出模式窗口A引发的异常,可以参考下面的方法:
用全局的MessageBox也即::MessageBox同时指定一个拥有MessageBox的窗口句柄,或者设置成NULL,默认为桌面拥有。
  • 打赏
  • 举报
回复
摸态窗口的问题.你要保证不要有其他路径能关闭摸态父窗口,如不能调用菜单
benbensan 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnzdgs 的回复:]
文档—视图架构的类对象都是动态创建的,在销毁窗口时会自动delete this,而MessageBox是在消息响应函数中创建的,当MessageBox返回后,还要访问窗口类对象,而此时对象已经释放了,所以会产生异常。
[/Quote]

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

有什么解决办法吗?
cnzdgs 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 benbensan 的回复:]
继承自CFrameWnd的对象在PostNCDestroy的时候的确会delete this;,但在这之前会先销毁自己创建的所有child window,我认为MessageBox出的这个对话框应该也是其Child,照理说不应该异常。

有什么解决办法吗?
[/Quote]
child window是具有WS_CHILD风格的窗口,MessageBox是popup window,不是child window,所以不会自动销毁。
pop3696 2009-06-10
  • 打赏
  • 举报
回复
当点击CTestWnd上某个按钮时貌似是这样:

void CTestWnd::onButtonclick()
{

AfxMessagebox("Hello", ID_OK);

//CTestWnd被 postMessage(WM_CLOCE,0,0);了,这时CTestWnd窗口对象被释放
//AfxMessagebox后面对窗口操作的代码会异常。
}
jian_tian_yang 2009-06-10
  • 打赏
  • 举报
回复
帮楼主顶一下
zhoujianhei 2009-06-10
  • 打赏
  • 举报
回复
DestroyWindow
应该是
PostMessage(WM_CLOSE, 0, 0);
fengrx 2009-06-10
  • 打赏
  • 举报
回复
调用::MessageBox试下吧,把HWND hWnd参数传NULL试下。
如果直接调用CWnd::MessageBox的话弹出窗口的父窗口就是你的CFrameWnd,所以会有问题。
Randyqiu 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cnzdgs 的回复:]
文档—视图架构的类对象都是动态创建的,在销毁窗口时会自动delete this,而MessageBox是在消息响应函数中创建的,当MessageBox返回后,还要访问窗口类对象,而此时对象已经释放了,所以会产生异常。
[/Quote]
请问:“当MessageBox返回后,还要访问窗口类对象”。。
还要访问窗口类对象干什么的啊?
cnzdgs 2009-06-10
  • 打赏
  • 举报
回复
文档—视图架构的类对象都是动态创建的,在销毁窗口时会自动delete this,而MessageBox是在消息响应函数中创建的,当MessageBox返回后,还要访问窗口类对象,而此时对象已经释放了,所以会产生异常。
sanshao27 2009-06-10
  • 打赏
  • 举报
回复
我觉得问题归根到底不是在你的MessageBox上,应该是你非模态窗口的释放上有问题。好好在看看你处理释放的代码
benbensan 2009-06-10
  • 打赏
  • 举报
回复
我来详细描述一下
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关掉的话,则第六步的不幸就不会发生
2hope 2009-06-10
  • 打赏
  • 举报
回复
PostMessage(WM_CLOSE, 0, 0);
NIKE霸天虎 2009-06-10
  • 打赏
  • 举报
回复
AfxMessageBox,你的叙述不是很清楚
oyljerry 2009-06-10
  • 打赏
  • 举报
回复
具体是MessageBox阻塞了窗口,还是窗口怎么退出..
fandh 2009-06-10
  • 打赏
  • 举报
回复
的确描述的不是很详细!
zjfhgdx 2009-06-10
  • 打赏
  • 举报
回复
我也有同样的问题,希望大牛来解答
Conry 2009-06-10
  • 打赏
  • 举报
回复
问:A窗口在哪里调用MessageBox打开一个消息框
A的DestroyWindow又是在哪里调用的

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧