1. 程式人生 > >MFC視窗程式退出訊息的響應

MFC視窗程式退出訊息的響應

1.MFC三個結束訊息的區別

WM_CLOSE:
在系統選單裡選擇了“關閉”或者點選了視窗右上角的“X”按鈕,你的視窗過程就會收到WM_CLOSE。DefWindowProc對 WM_CLOSE的處理是呼叫DestroyWindow。當然,你可以不讓DefWindowProc處理,而是自己處理,例如詢問使用者是否儲存更改等。如果使用者選擇“取消”,你忽略此訊息,程式照常執行,如果使用者確認要退出,你就呼叫DestroyWindow。
WM_DESTROY:
接下來,DestroyWindow完成視窗的清理工作,最後向視窗過程傳送WM_DESTROY。對於 WM_DESTROY,DefWindowProc不會處理。也就是說,你如果不處理這個訊息,雖然你的視窗已經銷燬,但程序並不會結束。一般處理 WM_DESTROY時都是釋放資源(例如申請的記憶體等),然後呼叫PostQuitMessage。
WM_QUIT:


PostQuitMessage會發送WM_QUIT給訊息佇列。注意,WM_QUIT永遠不會到達視窗過程,因為GetMessage得到WM_QUIT後就會返回FALSE,從而結束訊息迴圈,最後程序結束,程式退出。

2.CallWindowProc與DefWindowProc

LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);
函式功能:CallWindowProc將指定訊息資訊傳送給指定的視窗過程. lpPrevWndFunc是視窗訊息處理函式指標(函式名), hWnd為接受窗體控制代碼.
DefWindowProc

(HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam), 是讓Windows的預設訊息處理函式處理訊息.
函式功能:該函式呼叫預設的視窗過程來為應用程式沒有處理的任何視窗訊息提供預設的處理。該函式確保每一個訊息得到處理。呼叫DefWindowProc函式時使用視窗過程接收的相同引數。
二者關鍵的區別有, CallWindowProc 是傳送某個訊息給某個處理函式(包括自定義訊息處理函式), 而DefWindowProc 是傳送某個訊息給Windows預設(內定)的訊息處理函式.
如果理解了他們這一點的區別, 就能明白,
CalWindowPro(DefWindowProc, hWnd,Msg,wParam, lParam) 和
DefWindowProc(hWnd,Msg ,wParam,lParam);二者此時執行效果一樣

在Windows作業系統裡,當視窗顯示之後,它就可以接收到系統源源不斷地發過來的訊息,然後視窗就需要處理這些訊息,因此就需要一個函式來處理這些訊息。在API裡定義了一個函式為回撥函式,當系統需要向視窗傳送訊息時,就會呼叫視窗給出的回撥函式WindowProc,如果WindowProc函式不處理這個訊息,就可以把它轉向DefWindowProc函式來處理,這是系統的預設訊息處理函式。當你按下選單,或者點選視窗時,視窗需要執行這個訊息處理函式。
DefWindowProc函式呼叫預設的視窗過程來為應用程式沒有處理的任何視窗訊息提供預設的處理。該函式確保每一個訊息得到處理。如果某些訊息你不需要做特別的處理,呼叫DefWindowProc進行處理就可以了,不需要你自己再去些那些windows的"標準動作"。當DefWindowProc處理WM_DESTROY訊息時,它不自動呼叫PostQuitMessage。

3. OnClose( )與OnDestroy( )

OnClose( ):訊息響應函式,響應WM_CLOSE訊息,當"關閉"按鈕被單擊的時候(而不是我們眼睛所見的對話方塊從螢幕上消失時),該函式被呼叫,使用者在響應OnOk()或者OnCancel()函式之後,不會發送WM_CLOSE訊息。
OnDestroy( ):訊息響應函式,響應WM_DESTROY訊息,當一個視窗即將被銷燬時,被髮送在單檢視程式中,根據<<深入淺出MFC>>所講,程式退出時執行的操作順序為:
(1)使用者點選退出按鈕,傳送了WM_CLOSE訊息
(2)在WM_CLOSE訊息的處理函式中,呼叫DestroyWindow()
(3)在DestroyWindow()中傳送了WM_DESTROY訊息
(4)在WM_DESTROY訊息中呼叫PostQuitMessage(),傳送WM_QUIT訊息,結束訊息迴圈
綜上,程式先呼叫OnClose()(也可能不呼叫),然後呼叫OnDestroy()(必呼叫),所以,如果要進行程式結束時的清理工作,應該在OnDestroy()中,而不是在OnClose(),否則就有可能會出現記憶體洩漏的危險了!

4、傳送訊息SendMessage與PostMessage的區別

PostMessage將訊息放入訊息佇列後馬上返回,而SendMessage直到視窗過程處理完訊息後才返回

5、退出程式語句

exit(0);
postquitmessage(0);
onok();oncancel();
sendmessage(wm_close,0,0);
exitprocess(0);