MFC 運行過程(摘錄)
程式的誕生
*Application object 產生,記憶體於是獲得配置,初值亦設立了
*AfxWinMain 執行AfxWinInit,後者又調用AfxInitThread,把訊息佇列盡量加大到96
*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 發出WN_CLOSE
*CMyFrameWnd 並沒有設定WM_CLOSE處理常式,於是交給預設的處理常式
*預設函數對於WN_CLOSE的處理方式是調用::DestroyWindow,並因而發出WM_DESTROY
*預設的WN_DESTROY處理方式是調用::PostQuitMessage,因此發出WM_QUIT
*CWinApp::Run收到WM_QUIT後會結束其內部之訊息迴圈,然後調用ExitInstance,這是CWinApp的一個虛擬函數
*如果CMyWinApp改寫了ExitInstance,那麼CWinApp::Run所調用的就是CMyWinApp::ExitInstance,否則就是CWinApp::ExitInstance
*最後回到AfxWinMain,執行AfxWinTerm,結束程式