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