WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解
本文对WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数的功能及区别做出了分析比对,有助于读者更好的对消息投递函数加以理解。详情如下:
一、WM_CLOSE、WM_DESTROY、WM_QUIT区别
WM_CLOSE:关闭应用程序窗口
WM_DESTROY:关闭应用程序
WM_QUIT:关闭消息循环
只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失)。
win32应用程序的完整退出过程:点击窗口右上角的关闭按钮,发送WM_CLOSE消息。此消息处理中调用DestroyWindow函数,发送WM_DESTROY消息。此消息处理中调用PostQuitMessage(0)函数,发送WM_QUIT消息到消息队列中。GetMessage捕获到WM_QUIT,返回0,退出循环(应用程序真正退出)。
注意:按照上述正常流程,WM_QUIT是不会到达窗口过程的。(因为在GetMessage截获了WM_QUIT消息之后,程序已经彻底退出了!)
MFC应用程序的完整退出过程:点击窗口右上角的关闭按钮,或选择【File/Close】,发出 WM_CLOSE消息。CMyFrameWnd 并没有设置WM_CLOSE 处理常式,于是交给预设之处理常式。预设函数对于WM_CLOSE 的处理方式是呼叫 ::DestroyWindow, 并因而发出WM_DESTROY。预设之WM_DESTROY 处理方式是呼叫::PostQuitMessage,因此发出WM_QUIT。CWinApp::Run 收到WM_QUIT 后会结束其内部之讯息回路, 然后呼叫ExitInstance,这是CWinApp 的一个虚拟函数。如果自己应用程序类CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否则就是 CWinApp::ExitInstance。最后回到 AfxWinMain,执行 AfxWinTerm,结束程序。
附加:当调用DestroyWindow函数后,操作系统就会进行一系列的删除动作,先发送WM_DESTROY消息,接着发送WM_NCDESTROY消息。如果这个窗口还有子窗口或者是其它窗口的所有者,就需要给所有子窗口发送删除消息。
WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息.
相关代码分析:
//主函数中进入消息循环的代码片断 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); //将消息进行处理一下 DispatchMessage(&msg); //再将消息变量msg传给windows,让windows来调用消息处理函数 }
如果把GetMessage(&msg,NULL,0,0)改为GetMessage(&msg,hWnd,0,0),则发现关闭应用程序后,任务管理器中仍有该程序的进程,且占用大量的内存,why?
msdn中的原因解释是:对于GetMessage(&msg,hWnd,0,0),当第二个参数无效时,此函数返回值为-1。对于上述循环来说,此while条件为真,因此进入死循环,进程无法退出。
二、各种消息投递函数
1、SendMessage:发送消息给指定的窗口过程;直到窗口过程处理了消息才返回。
2、PostMessage:将消息放入消息队列(与指定窗口创建的线程相关)中;无需等待消息处理,立即返回。
不能发送WM_QUIT消息,此消息只能由PostQuitMessage函数发送。
3、PostThreadMessage:发送消息给指定线程的消息队列;无需等待线程处理消息,立即返回。
此函数发送的消息和窗口是无关的。我们只需指定线程ID就OK了,但要保证线程已创建,否则会失败。
4、GetMessage:从调用线程的消息队列中取消息。
当第二个参数为NULL时,它检索以下两种消息:
a、属于调用线程的任何窗口的消息;
b、由PostThreadMessag投递给该调用线程的消息。
5、PeekMessage:功能同GetMessage。区别是:
GetMessage:直到一个匹配了过滤条件的消息,被放到消息队列中才返回。
PeekMessage:不管消息是否放入队列,立即返回。
6、DispatchMessage:派遣消息给相应的窗口过程。
7、TranslateMessage:转换虚拟键信息到字符消息。
上一篇:MFC自定义消息的实现方法
栏 目:C语言
下一篇:C++智能指针实例详解
本文标题:WM_CLOSE、WM_DESTROY、WM_QUIT及各种消息投递函数详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3604.html
您可能感兴趣的文章
- 01-10C语言 解决不用+、-、×、÷数字运算符做加法
- 01-10基于C程序启动代码的深入分析
- 01-10深入分析父子线程、进程终止顺序不同产生的结果
- 01-10深入理解C/C++混合编程
- 01-10深入探讨linux下进程的最大线程数、进程最大数、进程打开的文
- 01-10linux c 获取本机公网IP的实现方法
- 01-10基于select、poll、epoll的区别详解
- 01-10基于大端法、小端法以及网络字节序的深入理解
- 01-10c语言字符数组与字符串的使用详解
- 01-10深入探讨:宏、内联函数与普通函数的区别
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什