WM_CLOSE、WM_DESTROY、WM_QUIT區別

本文對WM_CLOSE、WM_DESTROY、WM_QUIT及各種消息投遞函數的功能及區別做出了分析比對,有助於讀者更好的對消息投遞函數加以理解。詳情如下:

一、WM_CLOSE、WM_DESTROY、WM_QUIT區別

WM_CLOSE:關閉應用程序窗口

WM_DESTROY:關閉應用程序

WM_QUIT:關閉消息循環

只有關閉了消息循環,應用程序的進程才真正退出(在任務管理器裏消失)。

win32應用程序的完整退出過程:點擊窗口右上角的關閉按鈕,發送WM_CLOSE消息。此消息處理中調用DestroyWindow函數,發送WM_DESTROY消息。此消息處理中調用PostQuitMessage(0)函數,發送WM_QUIT消息到消息隊列中。GetMessage捕獲到WM_QUIT,返回0,退出循環(應用程序真正退出)。

注意:按照上述正常流程,WM_QUIT是不會到達窗口過程的。(因爲在GetMessage截獲了WM_QUIT消息之後,程序已經徹底退出了!)

MFC應用程序的完整退出過程:點擊窗口右上角的關閉按鈕,或選擇【File/Close】,發出 WM_CLOSE消息。CMyFrameWnd 並沒有設置WM_CLOSE 處理常式,於是交給預設之處理常式。預設函數對於WM_CLOSE 的處理方式是呼叫 ::DestroyWindow, 並因而發出WM_DESTROY。預設之WM_DESTROY 處理方式是呼叫::PostQuitMessage,因此發出WM_QUIT。CWinApp::Run 收到WM_QUIT 後會結束其內部之訊息迴路, 然後呼叫ExitInstance,這是CWinApp 的一個虛擬函數。如果自己應用程序類CMyWinApp 改寫了ExitInstance , 那麼CWinApp::Run 所呼叫的就是CMyWinApp::ExitInstance,否則就是 CWinApp::ExitInstance。最後回到 AfxWinMain,執行 AfxWinTerm,結束程序。

附加:當調用DestroyWindow函數後,操作系統就會進行一系列的刪除動作,先發送WM_DESTROY消息,接着發送WM_NCDESTROY消息。如果這個窗口還有子窗口或者是其它窗口的所有者,就需要給所有子窗口發送刪除消息。
WM_QUIT是唯一可以使GetMessage(&msg,NULL,0,0)返回假值的消息.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章