1. 程式人生 > >VC++中的MFC程式的執行過程

VC++中的MFC程式的執行過程

程式的誕生

#Application Object產生,內存於是獲得配置,初值亦設立完成。

#AfxWinMain執行AfxWinInit,後者又呼叫AfxInitThread,把訊息佇列儘量加大。

#AfxWinMain執行InitApplication。這是CwinApp的虛擬函式,但我們通常不改寫它。

#AfxWinMain執行InitInstance.這是CwinApp的虛擬函式,我們必須改寫。

#CMyWinApp::InitInstance 'new'了一個CMyFrameWnd物件。

#CMyFrameWnd建構函式呼叫Create,產生主視窗。我們在Create引數中指定的視窗類是NULL,於是MFC根據視窗種類,自行為我們註冊一個名為"AfxFrameOrView42d"的視窗類。

#回到InitInstance中繼續執行ShowWindow,顯示視窗。

#執行UpDateWindow,於是發出WM_PAINT.

#回到AfxWinMain,執行Run,進入訊息迴圈。


程式開始執行

#程式獲得WM_PAINT訊息(經由CwinApp::Run中的::GetMessage迴圈)。

#WM_PAINT經由::DispatchMessage送到視窗函式CWnd::DefWindowProc中。

#CWnd::DefWindowProc將訊息傳遞給訊息對映表格(Message Map)

#傳遞過程中發現有相符專案,於是呼叫專案中對應的函式。此函式是應用程式利用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間的巨集設立起來的。

#標準訊息的處理程式亦有標準命名,例如WM_PAINT必然由OnPaint處理。


程式的死亡

#使用者單擊File/close,於是發出WM_CLOSE.

#CMyFrameWnd並沒有設定WM_CLOSE處理程式,於是交給預設的處理程式。

#預設函式對於WM_CLOSE的處理方式就是呼叫::DestoryWindow,並因而發出WM_DESTORY。

#預設的WM_DESTROY處理方式是呼叫::PostQuitMessage。因此發出WM_QUIT.

#CwinApp::Run收到WM_QUIT後會結束其內部之訊息迴圈,然後呼叫ExitInstance,這是CwinApp的一個虛擬函式。

#如果CmyWinApp改寫了ExitInstance,那麼CwinApp::Run所呼叫的就是CmyWinApp::ExitInstance,否則就是CwinApp::ExitInstance.

#最後回到AfxWinMain,執行AfxWinTerm,結束程式。