WM_DESTROY,WM_CLOSE 功能有什么不同,为什么要设两个消息
WM_DESTROY,WM_CLOSE 功能有什么不同,为什么要设两个消息,是不是可以合并成一个?
下面程序执行时出错
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CMDIFrameWnd::OnClose();
CDocument *doc;
doc=this->GetActiveDocument();
}
下面程序执行时不出错,
void CMainFrame::OnDestroy()
{
CDocument *doc;
doc=this->GetActiveDocument();
CMDIFrameWnd::OnDestroy();
}
为什么呢?
问题点数:55、回复次数:7Top
1 楼scorpion()回复于 2000-07-25 10:32:00 得分 10
如果改为
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDocument *doc;
doc=this->GetActiveDocument();
CMDIFrameWnd::OnClose();
}
将不出错
下面程序执行时出错,
void CMainFrame::OnDestroy()
{
CMDIFrameWnd::OnDestroy();
CDocument *doc;
doc=this->GetActiveDocument();
}
原因如下:
OnClose()中调用DestoryWindow(),而DestoryWindow()中发送 WM_DESTROY 和 WM_NCDESTROY;DestoryWindow()执行结束时,OnDestroy()、OnNcDestory()也都执行了,在CMDIFrameWnd::OnClose()返回后,CMainFrame 的对象已被释放,this指针不可再用。
Top
2 楼huntout(猎手)回复于 2000-07-25 10:37:00 得分 10
這樣也會錯嗎?
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDocument *doc;
doc=this->GetActiveDocument();
CMDIFrameWnd::OnClose();
}
Top
3 楼superfox(楚歌)回复于 2000-07-25 10:37:00 得分 10
先处理WM_CLOSE(窗口未关闭),后处理WM_DESTROY(窗口已关闭)
CMDIFrameWnd::OnClose();后的部分不执行,如需要执行,可放到OnDestroy()中,即你的第二段Top
4 楼dawnsun(知之不多)回复于 2000-07-25 10:48:00 得分 10
WM_CLOSE是在窗口关闭前发送的,你还可以决定是否真的关闭窗口
WM_DESTROY是在窗口关闭过程中发送的,窗口已被移出屏幕
你的程序的错误在于调用 CMDIFrameWnd::OnClose(); 后窗体已经
被Destroy掉了,this指针指向的窗口对象已经不存在了,所以出错Top
5 楼Sunlet(大赢家)回复于 2000-07-25 17:56:00 得分 0
dawnsun,scorpion:
WM_DESTROY是在WM CLOSE以后发送的,如果wm_close时this指针指向的窗口对象已经不存在了,那么为什么在wm_destroy中又可以了呢?
请你们再帮忙解实一下。Top
6 楼yueyue()回复于 2000-07-25 23:53:00 得分 5
问题该与调用的函数有关,你可查一下窗口关闭时的顺序,看一下是哪一个对象先销毁,Top
7 楼dawnsun(知之不多)回复于 2000-07-27 00:45:00 得分 10
调用父类缺省处理 CMDIFrameWnd::OnClose()时, 系统又发出了
WM_DESTROY消息将窗口destroy了,所以OnDestroy中this指针还可以用,
等出了CMDIFrameWnd::OnClose()后this指针指向的窗口对象已经不存
在了,你在程序中设个断点一跟便知Top
相关问题
- 如何让WM_CLOSE一定调用WM_DESTROY消息
- VC 的 MFC ClassWizard 中 Messages 里的 DestroyWindow,WM_CLOSE,WM_DESTROY 有什么区别?
- Iczelion在教程3里(最后),WM_DESTROY WM_CLOSE WM_QUIT三个消息让我困惑。
- 关于几种消息的区别?WM_QUIT WM_DESTROY WM_DRAW WM_PAINT
- SDK下如何屏蔽 WM_DESTROY 消息?
- WM_CLOSE和WM_QUIT有何区别?
- 关于WM_CLOSE的问题
- 碰到一个古怪的问题,在对话框主界面,按回车竟然自动结束程序,不是wm_close或者ONCLOSE,而是直接的WM_destroy
- DialogBox的为什么没有WM_DESTROY消息?
- WM_CLOSE和WM_DESTORY之间到底是干什么关系?




