WM_CLOSE WM_DESTROY WM_QUIT的区别

本文详细解析了Windows消息系统中WM_CLOSE、WM_DESTROY和WM_QUIT三种关键消息的作用与区别,为理解Windows应用程序的消息处理机制提供了清晰的指导。

WM_CLOSE:关闭应用程序窗口

WM_DESTROY:关闭应用程序
WM_QUIT:关闭消息循环

转载于:https://www.cnblogs.com/Browneyes/p/6100153.html

### WM_DESTROY消息的处理方式与使用示例 WM_DESTROY消息是在窗口销毁时由操作系统发送的消息。当调用 `DestroyWindow` 函数后,操作系统会先发送 WM_DESTROY 消息,然后发送 WM_NCDESTROY 消息[^2]。如果窗口有子窗口或其他窗口的所有者,系统还会向所有子窗口发送删除消息。 以下是关于 WM_DESTROY 消息的处理方式和一个简单的使用示例: #### 处理方式 在窗口过程函数(Window Procedure)中捕获 WM_DESTROY 消息,并根据需要执行清理操作。例如,可以在此处释放资源、关闭文件句柄或进行其他必要的清理工作。此外,通常会在处理完 WM_DESTROY 后调用 `PostQuitMessage` 函数以退出消息循环[^2]。 #### 使用示例 以下是一个简单的 C++ 示例代码,展示了如何处理 WM_DESTROY 消息并退出应用程序的消息循环: ```cpp #include <windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_DESTROY: // 执行清理操作 PostQuitMessage(0); // 发送 WM_QUIT 消息以退出消息循环 break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { const char* className = "ExampleClass"; WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = className; if (!RegisterClassEx(&wc)) { return 1; } HWND hwnd = CreateWindowEx( 0, className, "Example Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL ); if (!hwnd) { return 1; } ShowWindow(hwnd, nCmdShow); MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } ``` 上述代码定义了一个窗口类并创建了一个窗口。在窗口过程函数 `WndProc` 中,当接收到 WM_DESTROY 消息时,调用 `PostQuitMessage` 函数以退出消息循环[^2]。 ### 注意事项 - 在处理 WM_DESTROY 消息时,应确保所有分配的资源已被正确释放。 - 如果窗口有子窗口或与其他窗口存在依赖关系,需确保这些窗口也得到适当的清理。 - 调用 `PostQuitMessage` 是退出消息循环的标准方法,它会发送 WM_QUIT 消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值