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,結束程式。