WM_DESTROY,WM_CLOSE 功能有什么不同 ?

作者在 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()   
  { 
      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指针不可再用。
基础知识 | 阅读 9417 次
文章评论,共0条
游客请输入验证码
浏览1970309次