轉:MFC 程式入口和執行流程

來源:互聯網
上載者:User

一 MFC程式執行過程剖析

1)我們知道在WIN32API程式當中,程式的入口為WinMain函數,在這個函數當中我們完成註冊視窗類別,建立視窗,進入訊息迴圈,最後由作業系統根據發送到程式視窗的訊息調用程式的視窗函數。而在MFC程式當中我們不在能找到類似WinMain這樣的程式入口,取而代之的是一系列衍生類別的聲明和定義以及一個沖CWinApp類派生而來的類的全域對象。CWinApp類被稱之為應用程式物件,在一個MFC程式當中只允許有一個應用程式物件。由於CWinApp的派生對象是全域的,因此這個對象的建構函式會在所有的其他代碼運行之前被調用,而由於CWinApp類當中包含了HWND、HINSTANCE等控制代碼的存在,其建構函式就執行了對這些成員資料的初始化操作,這裡的所謂初始化僅僅是把所有的控制代碼對象賦值為NULL。

2)在調用完CWinApp的建構函式以後由連接器向程式內自動連結的AfxWinMain函數將被調用,而這個函數可以被看作MFC程式的入口函數。在這個函數當中調用全域AfxGetApp()函數獲得應用程式物件,這時將調用AfxInit全域函數,這個函數的功能是使用作業系統傳遞給AfxWinMain函數的參數初始化應用程式物件當中的相關控制代碼資料成員。

3)之後AfxWinMain函數調用CWinApp::InitApplication成員函數,這個成員函數用來初始化應用程式物件當中的關於文檔部分的內容。

4)隨後調用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函數清理程式使用過的資源並且結束整個程式。
小結:以上的所有描述涵蓋了一個程式從開始、運行到結束的所有過程。 相信大家有點暈點了吧,實際編程中沒有必要深刻理解這麼多,這些大都是由MFC內部自動幫我們完成的。實際MFC編程過程中,其實懂得MFC程式中各個函數的執行流程即可。有時候過於追究MFC細節會白白浪費我們的精力,應該將主要精力放在使用MFC解決實際問題上。

  二 VC6中SDI程式的執行流程
下面以VC6中的sdi工程為例,通過給每個函數前設定斷點後調式執行,可以看出MFC的SDI的執行流程。記錄如下,希望對MFC執行有疑惑的人有協助。1)CSdiApp theApp;          //sdi.cpp2)CSdiApp::CSdiApp()             //sdi.cpp3)BOOL CSdiApp::InitInstance()         //sdi.cpp4)CSdiDoc::CSdiDoc()                   //sdiDoc.cpp5)CMainFrame::CMainFrame()          //MainFrm.cpp6)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)    //MainFrm.cpp7)int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)    //MainFrm.cpp8)CSdiView::CSdiView()                     //sdiView.cpp9)BOOL CSdiView::PreCreateWindow(CREATESTRUCT& cs)         //sdiView.cpp10)BOOL CSdiDoc::OnNewDocument()                //sdiDoc.cpp11) void CSdiView::OnDraw(CDC* pDC)                //sdiView.cpp// ---------------- 關閉視窗後-------------------------------------12) CSdiView::~CSdiView()13) CMainFrame::~CMainFrame()14) CSdiDoc::~CSdiDoc() 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.