WM_QUIT, WM_CLOSE, WM_DESTROY的一些区别

本文详细解释了Windows消息循环中WM_CLOSE、WM_DESTROY和WM_QUIT的作用及处理方式。当用户点击关闭按钮时触发WM_CLOSE消息,若不使用默认处理则需自行调用DestroyWindow;WM_DESTROY用于释放资源并调用PostQuitMessage;而WM_QUIT则用于结束消息循环。

转自http://blog.chinaunix.net/uid-16318340-id-2748753.html

WM_CLOSE:

  在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对 WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改 等。如果用户选择“取消”,你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。


WM_DESTROY:

  接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),然后调用PostQuitMessage。

 

WM_QUIT:

  PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。


当使用者按下系统功能表中的Close按钮,系统送出WM_Close,通常程序的窗口函数不拦截此消息,于是DefWindowProc处理 它,DefWindowProc收到WM_Close后调用DestoryWindow把窗口清除,DestroyWindow本身会送出 WM_Destory.程序对WM_Destory的标准反应是调用PostQuitMessage,PostQuitMessage送出 WM_Quit,结束消息循环

在Windows编程中,特别是使用Win32 API进行窗口程序设计时,应用程序的消息循环会处理各种消息,其中WM_CLOSEWM_DESTROYWM_QUIT是与窗口关闭相关的消息。它们出现的顺序通常如下: 1. WM_CLOSE消息是在用户尝试关闭窗口时产生的,例如通过点击窗口的关闭按钮。应用程序可以通过处理WM_CLOSE消息来询问用户是否真的要关闭窗口,并执行必要的清理工作。在调用DestroyWindow函数后,系统会发送WM_CLOSE消息。 2. WM_DESTROY消息是在窗口即将被销毁之前发送的。当窗口接收到WM_CLOSE消息并且调用DestroyWindow后,窗口会被销毁。此时,窗口的父窗口(如果有的话)会收到WM_DESTROY消息。 3. WM_QUIT消息是在程序调用PostQuitMessage时产生的,这通常发生在处理WM_DESTROY消息的最后。WM_QUIT消息会导致消息循环退出,从而结束应用程序。 为了验证这三个消息出现的顺序,可以在Win32应用程序的消息处理函数中添加相应的代码来记录这三个消息的接收顺序。示例如下: ```c LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE: // 在这里添加代码以验证WM_CLOSE消息 // 例如:记录日志或者设置一个标志 break; case WM_DESTROY: // 在这里添加代码以验证WM_DESTROY消息 // 例如:记录日志或者设置一个标志 break; case WM_QUIT: // 在这里添加代码以验证WM_QUIT消息 // 例如:记录日志或者设置一个标志 break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } ``` 在上面的代码中,你需要用一些机制(如全局变量或者日志记录)来记录这三个消息的处理顺序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值