作者在 2008-09-28 09:50:14 发布以下内容
WM_DESTROY,WM_CLOSE 功能有什么不同
下面程序执行时出错
void CMainFrame::OnClose()
{
CMDIFrameWnd::OnClose();
CDocument *doc;
doc=this->GetActiveDocument();
}
下面程序执行时不出错,
void CMainFrame::OnDestroy()
{
CDocument *doc;
doc=this->GetActiveDocument();
CMDIFrameWnd::OnDestroy();
}
原因分析:
WM_CLOSE是在窗口关闭前发送的,你还可以决定是否真的关闭窗口
WM_DESTROY是在窗口关闭过程中发送的,窗口已被移出屏幕
你的程序的错误在于调用 CMDIFrameWnd::OnClose(); 后窗体已经
被Destroy掉了,this指针指向的窗口对象已经不存在了,所以出错
也就是处理顺序是先处理WM_CLOSE(窗口未关闭),后处理WM_DESTROY(窗口已关闭)
CMDIFrameWnd::OnClose();后的部分不执行,如需要执行,可放到OnDestroy()中,即你的第二段
调用父类缺省处理 CMDIFrameWnd::OnClose()时, 系统又发出了
WM_DESTROY消息将窗口destroy了,所以OnDestroy中this指针还可以用,
等出了CMDIFrameWnd::OnClose()后this指针指向的窗口对象已经不存在了
下面程序执行时出错
void CMainFrame::OnClose()
{
CMDIFrameWnd::OnClose();
CDocument *doc;
doc=this->GetActiveDocument();
}
下面程序执行时不出错,
void CMainFrame::OnDestroy()
{
CDocument *doc;
doc=this->GetActiveDocument();
CMDIFrameWnd::OnDestroy();
}
原因分析:
WM_CLOSE是在窗口关闭前发送的,你还可以决定是否真的关闭窗口
WM_DESTROY是在窗口关闭过程中发送的,窗口已被移出屏幕
你的程序的错误在于调用 CMDIFrameWnd::OnClose(); 后窗体已经
被Destroy掉了,this指针指向的窗口对象已经不存在了,所以出错
也就是处理顺序是先处理WM_CLOSE(窗口未关闭),后处理WM_DESTROY(窗口已关闭)
CMDIFrameWnd::OnClose();后的部分不执行,如需要执行,可放到OnDestroy()中,即你的第二段
调用父类缺省处理 CMDIFrameWnd::OnClose()时, 系统又发出了
WM_DESTROY消息将窗口destroy了,所以OnDestroy中this指针还可以用,
等出了CMDIFrameWnd::OnClose()后this指针指向的窗口对象已经不存在了
同理:
void CMainFrame::OnClose()
{
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指针不可再用。
void CMainFrame::OnClose()
{
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指针不可再用。