MFC學習(三)程序入口和執行流程


1) WIN32 API程序當中,程序入口為WinMain函數,在這個函數當中我們完成注冊窗口類,創建窗口,進入消息循環,最后由操作系統根據發送到程序窗口的消息調用程序窗口函數。而在MFC程序當中我們找不到類似WinMan這樣的程序入口,取而代之的是一系列派生類的聲明和定義以及一個從CWinApp類派生而來的類的全局對象。CWinApp類被稱為應用程序對象,在一個MFC程序中只允許有一個應用程序對象。由於CWinApp的派生類對象是全局的,因此這個對象的構造函數會在所有的其他代碼運行之前調用,而由於CWinApp類當中包含了HWND、HINSTANCE等句柄的存在,其構造函數就執行了對這些成員數據的初始化操作。

2) 調用往CWinApp的構造函數后,AfxWinMain函數被調用,而這個函數可以被看做MFC程序的入口函數。在這個函數當中調用全局AfxGetApp()函數獲得應用程序對象,這時將調用AfxInit全局函數,功能是使用操作系統傳遞給AfxWinMain函數的參數初始化應用程序對象當中的相關句柄數據成員。

3) AfxWinMain函數調用CWinApp::InitApplication()成員函數,初始化應用程序對象當中的關於文檔部分的內容

4) AfxWinMain函數調用CWinApp::InitInstance成員函數,函數中,用new在堆上聲明一個框架窗口對象,框架窗口對象的構造函數被調用,構造函數當中調用Create函數來創建窗口,而調用的create函數一般將WNDCLASS參數設置成NULL,,這樣就由MFC內部調用PreCreateWindow函數,在這個函數當中由MFC注冊幾個默認的WNDCLASS供框架窗口的Create使用。這時程序控制權交還給CWinApp::InitInstance成員函數內部,由這個函數調用CWnd::ShowWindow顯示窗口並且調用CWnd::UpdateWindow向窗口發送WM_PAINT消息。調用完CWinApp::InitInstance成員函數后由AfxWinMain函數調用CWinApp::Run成員函數,並由這個函數來創建和處理消息循環,並且在沒有消息的時候處理OnIdle空閑處理。至此整個程序的創建過程完成。

5)在程序的運行過程當中,由操作系統源源不斷的發送消息給應用程序,並且由CWinApp::Run當中的消息循環處理並且分發給相關的窗口對象的DefWindowProc成員函數,並由這個成員函數查詢窗口對象的消息映射表,如果查到對應項,則由登記在消息映射表當中的類成員函數處理,否則則按照Message Route當中的順序象父層類發送。

6)在消息運行結束,用戶按下關閉按鈕后,操作系統向程序發送WM_CLOSE消息,默認狀況下程序調用DestoryWindow並且發送WM_DESTORY消息,應用程序接受到這個消息以后的默認操作是調用PostQuitMessage函數,由這個函數發送WM_QUIT消息。當程序對象接受到WM_QUIT消息后消息循環結束,由AfxWinMain函數調用AfxTerm函數清理程序使用過的資源並且結束整個程序。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM