Windows中點擊“關閉”按鈕發生了什嗎?

來源:互聯網
上載者:User

標籤: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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.