[轉載] MFC程序的來龍去脈


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章