WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解

转载 2011年01月17日 15:34:00

【原文地址:http://blog.csdn.net/yfqvip/archive/2008/11/28/3403411.aspx】

 

通常我们理解在窗口创建时发出消息WM_CREATE,但是在这个消息之前还有一个消息是被发出的WM_NCCREATE。
即:
WM_NCCREATE
WM_CREATE
对应的,在窗口被关闭时发出消息WM_DESTROY,WM_NCDESTROY。
顺序:
WM_DESTROY
WM_NCDESTROY
这里要注意的是,在一个窗口被关闭时,如果这个窗口存在子窗口,那么会先发送子窗口的WM_DESTROY和WM_NCDESTROY消息,接着发送父窗口的WM_DESTROY和WM_NCDESTROY消息。
顺序:
WM_DESTROY    //CHILD,子窗口消息
WM_NCDESTROY  //CHILD,子窗口消息
WM_DESTROY    //Parent,父窗口消息   
WM_NCDESTROY  //Parent,父窗口消息
下面通过例子来验证这个执行顺序:
1.新建立一个MFC工程,工程名TestCreate,这时已经有一个默认的窗体TestCreate,设置如下:

2.接下来添加子窗体TestChild,不做设置。
3.添加打开子窗体事件响应:

  1. #include "TestChild.h"
  2. void  CTestCreateDlg::OnButton2() //打开子窗体
  3. {
  4.     if  (!frm.GetSafeHwnd())
  5.     {
  6.         frm.Create(IDD_TESTCHILD_DIALOG,this );
  7.     }
  8.     frm.ShowWindow(SW_SHOW);
  9. }

4.为父窗体添加消息处理函数

  1. LRESULT  CTestCreateDlg::DefWindowProc(UINT  message, WPARAM  wParam, LPARAM  lParam) 
  2. {
  3.     // TODO: Add your specialized code here and/or call the base class
  4.     switch (message)
  5.     {
  6.     case  WM_CREATE:
  7.         TRACE0("----------------------WM_CREATE/n" );
  8.         break ;
  9.     case  WM_NCCREATE:
  10.         TRACE0("----------------------WM_NCCREATE/n" );
  11.         break ;
  12.     case  WM_DESTROY:
  13.         TRACE0("----------------------WM_DESTROY/n" );
  14.         break ;
  15.     case  WM_NCDESTROY:
  16.         TRACE0("----------------------WM_NCDESTROY/n" );
  17.         break ;
  18.     default :
  19.         break ;
  20.     }
  21.     return  CDialog::DefWindowProc(message, wParam, lParam);
  22. }

5.为子窗体添加消息处理函数

  1. LRESULT  CTestChild::DefWindowProc(UINT  message, WPARAM  wParam, LPARAM  lParam) 
  2. {
  3.     // TODO: Add your specialized code here and/or call the base class
  4.     switch (message)
  5.     {
  6.     case  WM_CREATE:
  7.         TRACE0("----------------------WM_CREATE_CHILD/n" );
  8.         break ;
  9.     case  WM_NCCREATE:
  10.         TRACE0("----------------------WM_NCCREATE_CHILD/n" );
  11.         break ;
  12.     case  WM_DESTROY:
  13.         TRACE0("----------------------WM_DESTROY_CHILD/n" );
  14.         break ;
  15.     case  WM_NCDESTROY:
  16.         TRACE0("----------------------WM_NCDESTROY_CHILD/n" );
  17.         break ;
  18.     default :
  19.         break ;
  20.     }
  21.     return  CDialog::DefWindowProc(message, wParam, lParam);
  22. }

到此,一个测试例程就做好了,Alt+2打开Output窗口,运行。
点击按钮打开子窗体,然后切换到父窗体,并点击关闭按钮,可以看到输出结果:
----------------------WM_NCCREATE
Loaded 'C:/WINDOWS/system32/version.dll', no matching symbolic information found.
Loaded 'C:/WINDOWS/system32/MSCTFIME.IME', no matching symbolic information found.
----------------------WM_CREATE
----------------------WM_NCCREATE_CHILD
----------------------WM_CREATE_CHILD
----------------------WM_DESTROY_CHILD
----------------------WM_NCDESTROY_CHILD
----------------------WM_DESTROY
----------------------WM_NCDESTROY

MFC中有关WM_CREATE消息

我只知道在创建完一个窗口后,显示窗口前要调用OnCreate函数,由于Windows应用程序是一种消息处理 机制,当创建完一个窗口后,Windows应用程序就处于等待消息的状态,如果我在OnCrea...

WM_CREATE消息的处理过程

今天在看的时候, 有一个小问题困扰了我很长时间.书中写到在CreateWindowEx函数中会发出WM_CREATE消息, 之后会在CmainFrame::OnCreate中处理. 我突然想到, 在C...

二、WM_CREATE消息

一、你好世界 通常

vc 之WM_CREATE

WM_CREATE是windows中一个窗口消息。   当一个应用程序创建窗口时,会通过消息处理函数。但是这个消息在 CreateWindow 函数返回之前被送到消息处理函数。   例如,当要获取系统...

WM_NCCALCSIZE消息处理详解修正

【前言】 看了网上的一篇《关于WM_NCCALCSIZE消息处理详解(原帖由niesongsong发表)》 的文章,正好自己正在写换肤程序,用了以后发现了一些问题,特贡献出来供 大家参考学习! ...

WM_PAINT 消息详解

本文转自:http://hi.baidu.com/sunkanghome/blog/item/90f3d3893b5923b60f244428.html WM_PAINT是Windows窗口系统中一条...

WM8903 codec driver 的详解

wm8903_codec_driver   source_code的路径是在/kernel/sound/soc/codecs/wm88903.c里面   driver的入口函数是: stat...

孙鑫VC++深入详解:Lesson8 Part3---如何让对话框捕获WM_KEYDOWN消息?

因为对话框程序中,某些特点的消息,如按键消息被Windows内部的对话框过程处理了,即基类完成了或者被发送给子控件处理,所以在对话框类中就不能捕获到按键消息 解决办法:在子类中覆盖基类的特定...
  • sergery
  • sergery
  • 2013年07月10日 00:48
  • 2530

WM消息详解

WM_NULL = $0000;WM_CREATE = $0001;应用程序创建一个窗口WM_DESTROY = $0002;一个窗口被销毁WM_MOVE = $0003;移动一个窗口WM_SIZE ...

WM_PAINT详解

WM_paint详解   http://blog.sina.com.cn 2007年02月15日17:43 7456wg 标签: WM_PAINT...
  • Narvik
  • Narvik
  • 2013年07月24日 13:26
  • 400
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
举报原因:
原因补充:

(最多只允许输入30个字)