CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

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

楼主Sunlet(大赢家)2000-07-25 10:11:00 在 VC/MFC / 基础类 提问

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之间到底是干什么关系?

关键词

  • 指针
  • 执行
  • 消息
  • code
  • onclose
  • cmdiframewnd
  • destroy
  • ondestroy
  • getactivedocument
  • wm

得分解答快速导航

  • 帖主:Sunlet
  • scorpion
  • huntout
  • superfox
  • dawnsun
  • yueyue
  • dawnsun

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo