標籤:windows 訊息
對於Windows操作,當使用者點擊"關閉"按鈕時,視窗函數就會收到一個WM_DESTROY訊息。
視窗函數應該調用PostQuitMessage(0) 向訊息佇列插入一個WM_QUIT訊息。GetMessage 如果從訊息佇列中取得的是WM_QUIT訊息,它將返回0,從而導致訊息迴圈結束,WinMain函數退出,整個應用程式退出。
只要通過點擊視窗右上方的“關閉”按鈕,來關閉視窗並退出應用程式。能不能在結束應用程式之前彈出一個對話方塊,來確認一下我們的操作呢?
要做到這一點,首先要瞭解單擊“關閉”按鈕開始,一直到最後應用程式退出到底發生了什麼。其實,這是一個很“複雜”的過程,描述如下:
1)單擊視窗右上方的“關閉”按鈕,系統向訊息佇列插入WM_CLOSE訊息;
2)視窗函數調用DefWindowProc 處理WM_CLOSE訊息:調用DestroyWindow() 函數;
3)視窗關閉,並向訊息佇列插入WM_DESTROY訊息;
4)視窗函數函數處理WM_DESTROY訊息:調用PostQuitMessage 函數,向訊息佇列插入WM_QUIT訊息;
5)主函數的訊息迴圈中的GetMessage擷取WM_QUIT訊息返回0,導致訊息迴圈結束,進而WinMain函數結束,再進而整個進程結束。
我們可以從這個過程中看到三個訊息:WM_CLOSE、WM_DESTROY、WM_QUIT。
WM_CLOSE代表使用者希望結束應用程式;WM_DESTROY代表視窗的關閉;WM_QUIT代表進程的結束。
怎樣在結束應用程式之前彈出一個對話方塊,來確認一下我們的操作呢?可以在WndProc 中添加對WM_CLOSE的訊息處理。代碼如下:
//視窗函數,用於訊息處理LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){int nSel=0;switch(msg){case WM_CLOSE:nSel=MessageBox(hWnd,L"你真的要退出嗎?",szWindowTitle,MB_YESNO|MB_ICONQUESTION);if(nSel==IDYES) DestroyWindow(hWnd);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProc(hWnd,msg,wParam,lParam);}}
效果如下:
關於視窗函數與訊息處理機制: http://blog.csdn.net/sanqima/article/details/34427471
http://blog.csdn.net/sanqima/article/details/32179711