WM_CLOSE WM_DESTORY WM_QUIT 区别
2012-04-13 14:02
441 查看
最近面试,被问到好几次WM_CLOSE WM_DESTORY WM_QUIT 的区别这样的问题,也没答上来。回来后查了下MSDN,才算明白了他们之间的区别,MSDN的链接。
下面就分析下窗口关闭的流程:
1. WM_CLOSE
当用户点击窗口右上角的关闭按钮或者按下键盘的Alt+F4时,窗口会收到WM_CLOSE消息,此时窗口本身,以及窗口的子窗口,都是还存在的。此时可以给用户一次取消关闭窗口的机会,让用户决定是否真的要关闭窗口。用户确定要关闭该窗口,则调用DestoryWindow,该函数会发送一个WM_DESTORY消息。当然也可以不给用户取消关闭窗口的机会,直接调用DestoryWindow。
2. WM_DESTORY
在处理WM_DESTORY消息时,此时窗口本身已经不在屏幕上显示了,但是在该窗口的销毁前(主要是指该窗口的子窗口销毁前)。一般情况下会调用PostQuitMessage,该函数会在窗口的消息队列里放置WM_QUIT消息。
3. WM_QUIT
GetMessage在获取到WM_QUIT消息时,则返回FALSE,同时while循环结束。
引用下MSDN里的流程图:
![](http://i.msdn.microsoft.com/dynimg/IC378566.png)
总结.
在用户想关闭窗口时,处理WM_CLOSE消息,可以让用户有取消关闭的机会,或者改变WM_CLOSE的行为,例如QQ可以设置点击关闭按钮,是最小化到又下角的任务栏里,还是直接关闭QQ。在处理WM_DESTORY时,该窗口已经不在屏幕上显示了,也就是说窗口已经开始销毁了,没机会取消关闭窗口的操作。WM_QUIT则是用来退出消息循环的。
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { MSG msg; //........... // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CLOSE: if (MessageBox(hWnd, L"Really quit?", L"My application", MB_OKCANCEL) == IDOK) { DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
下面就分析下窗口关闭的流程:
1. WM_CLOSE
当用户点击窗口右上角的关闭按钮或者按下键盘的Alt+F4时,窗口会收到WM_CLOSE消息,此时窗口本身,以及窗口的子窗口,都是还存在的。此时可以给用户一次取消关闭窗口的机会,让用户决定是否真的要关闭窗口。用户确定要关闭该窗口,则调用DestoryWindow,该函数会发送一个WM_DESTORY消息。当然也可以不给用户取消关闭窗口的机会,直接调用DestoryWindow。
2. WM_DESTORY
在处理WM_DESTORY消息时,此时窗口本身已经不在屏幕上显示了,但是在该窗口的销毁前(主要是指该窗口的子窗口销毁前)。一般情况下会调用PostQuitMessage,该函数会在窗口的消息队列里放置WM_QUIT消息。
3. WM_QUIT
GetMessage在获取到WM_QUIT消息时,则返回FALSE,同时while循环结束。
引用下MSDN里的流程图:
![](http://i.msdn.microsoft.com/dynimg/IC378566.png)
总结.
在用户想关闭窗口时,处理WM_CLOSE消息,可以让用户有取消关闭的机会,或者改变WM_CLOSE的行为,例如QQ可以设置点击关闭按钮,是最小化到又下角的任务栏里,还是直接关闭QQ。在处理WM_DESTORY时,该窗口已经不在屏幕上显示了,也就是说窗口已经开始销毁了,没机会取消关闭窗口的操作。WM_QUIT则是用来退出消息循环的。
相关文章推荐
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_QUIT 和 WM_DESTROY EndDialog的区别
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- WM_CLOSE WM_DESTROY WM_QUIT消息
- WM_CLOSE、WM_DESTROY、WM_QUIT区别
- WM_Close,WM_Destory与WM_Quit的区别
- WM_CLOSE WM_QUIT WM_DESTROY 三者的区别
- WM_DESTROY ,WM_CLOSE ,WM_QUIT 的区别
- WM_CLOSE,WM_QUIT,WM_DESTROY区别!
- WM_DESTROY WM_CLOSE WM_QUIT三个消息的理解
- WM_CLOSE WM_QUIT WM_DESTROY 三者的区别
- WM_Close,WM_Destory与WM_Quit的区别
- WM_CLOSE、WM_DESTROY、WM_QUIT的区别(询问,销毁窗口,退出进程,都不是一回事)
- WM_CLOSE,WM_QUIT,WM_DESTROY的区别
- 经常使用现有的程序框架,总会忘记一些不经常入目的细微区别 WM_QUIT WM_CLOSE WM_DESTROY
- WM_Close,WM_Destory与WM_Quit的区别