WM_DESTROY,WM_CLOSE 功能有什么不同,为什么要设两个消息

Sunlet 2000-07-25 10:11:00
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();
}
为什么呢?

...全文
1631 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnsun 2000-07-27
  • 打赏
  • 举报
回复
调用父类缺省处理 CMDIFrameWnd::OnClose()时, 系统又发出了
WM_DESTROY消息将窗口destroy了,所以OnDestroy中this指针还可以用,
等出了CMDIFrameWnd::OnClose()后this指针指向的窗口对象已经不存
在了,你在程序中设个断点一跟便知
yueyue 2000-07-25
  • 打赏
  • 举报
回复
问题该与调用的函数有关,你可查一下窗口关闭时的顺序,看一下是哪一个对象先销毁,
dawnsun 2000-07-25
  • 打赏
  • 举报
回复
WM_CLOSE是在窗口关闭前发送的,你还可以决定是否真的关闭窗口
WM_DESTROY是在窗口关闭过程中发送的,窗口已被移出屏幕
你的程序的错误在于调用 CMDIFrameWnd::OnClose(); 后窗体已经
被Destroy掉了,this指针指向的窗口对象已经不存在了,所以出错
huntout 2000-07-25
  • 打赏
  • 举报
回复
這樣也會錯嗎?
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDocument *doc;
doc=this->GetActiveDocument();

CMDIFrameWnd::OnClose();
}
seaskyfox 2000-07-25
  • 打赏
  • 举报
回复
先处理WM_CLOSE(窗口未关闭),后处理WM_DESTROY(窗口已关闭)
CMDIFrameWnd::OnClose();后的部分不执行,如需要执行,可放到OnDestroy()中,即你的第二段
scorpion 2000-07-25
  • 打赏
  • 举报
回复
如果改为
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指针不可再用。
Sunlet 2000-07-25
  • 打赏
  • 举报
回复
dawnsun,scorpion:
WM_DESTROY是在WM CLOSE以后发送的,如果wm_close时this指针指向的窗口对象已经不存在了,那么为什么在wm_destroy中又可以了呢?
请你们再帮忙解实一下。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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