WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
来源:互联网 发布:数字网络广播系统 编辑:程序博客网 时间:2024/06/10 04:01
通常我们理解在窗口创建时发出消息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.添加打开子窗体事件响应:
4.为父窗体添加消息处理函数
5.为子窗体添加消息处理函数
到此,一个测试例程就做好了,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
即:
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.添加打开子窗体事件响应:
- #include "TestChild.h"
- void CTestCreateDlg::OnButton2() //打开子窗体
- {
- if (!frm.GetSafeHwnd())
- {
- frm.Create(IDD_TESTCHILD_DIALOG,this);
- }
- frm.ShowWindow(SW_SHOW);
- }
- LRESULT CTestCreateDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- // TODO: Add your specialized code here and/or call the base class
- switch(message)
- {
- case WM_CREATE:
- TRACE0("----------------------WM_CREATE/n");
- break;
- case WM_NCCREATE:
- TRACE0("----------------------WM_NCCREATE/n");
- break;
- case WM_DESTROY:
- TRACE0("----------------------WM_DESTROY/n");
- break;
- case WM_NCDESTROY:
- TRACE0("----------------------WM_NCDESTROY/n");
- break;
- default:
- break;
- }
- return CDialog::DefWindowProc(message, wParam, lParam);
- }
- LRESULT CTestChild::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- // TODO: Add your specialized code here and/or call the base class
- switch(message)
- {
- case WM_CREATE:
- TRACE0("----------------------WM_CREATE_CHILD/n");
- break;
- case WM_NCCREATE:
- TRACE0("----------------------WM_NCCREATE_CHILD/n");
- break;
- case WM_DESTROY:
- TRACE0("----------------------WM_DESTROY_CHILD/n");
- break;
- case WM_NCDESTROY:
- TRACE0("----------------------WM_NCDESTROY_CHILD/n");
- break;
- default:
- break;
- }
- return CDialog::DefWindowProc(message, wParam, lParam);
- }
点击按钮打开子窗体,然后切换到父窗体,并点击关闭按钮,可以看到输出结果:
----------------------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
0 0
- WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
- WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
- WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
- WM_DESTROY & WM_NCDESTROY
- WM_DESTROY 和 WM_NCDESTROY
- win32 WM_DESTROY 和 WM_NCDESTROY.
- WM_DESTROY 和 WM_NCDESTROY 消息之间有什么区别? (译)
- What is the difference between WM_DESTROY and WM_NCDESTROY?
- windows——消息——WM_CREATE WM_DESTROY
- WM_CREATE
- WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解
- WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解
- WM_CREATE & WM_INITDIALOG
- WM_CREATE消息
- 有关wm_create消息
- vc 之WM_CREATE
- WM_CREATE MFC OnCreate
- WM_SIZE和WM_CREATE谁先谁后
- iOS开发- UICollectionView详解+实例
- error while loading shared libraries
- winform弹出确认窗口
- swift学习-错误处理(十八)
- 周记 - 10.12
- WM_CREATE ,WM_NCCREATE,WM_DESTROY,WM_NCDESTROY详解
- android 打包成apk时报错,但是clean后没有错误的解决方法
- java 通过实现Runnable接口实现多线程
- github linux 用法
- js中自定义回调函数
- POJ 1328 Radar Installation 贪心
- 获取iOS设备的唯一标识
- C/C++ IDE之C-Free(配置GCC、Visual C++、Borland C++编译器)
- xml:中无法找到 标签元素