MFC的類層次結(jié)構(gòu):![]() ![]() ![]() 如上圖所示: CObject:是MFC提供的絕大多數(shù)類的基類。該類完成動態(tài)空間的分配與回收,支持一般的診斷、出錯信息處理和文檔序列化等。 CCmdTarget:主要負責將系統(tǒng)事件(消息)和窗口事件(消息),發(fā)送給響應這些事件的對象,完成消息發(fā)送、等待和派遣調(diào)度等工作,實現(xiàn)應用程序的對象之間協(xié)調(diào)運行。 CWinApp:是應用程序的主線程類,它是從CWinThread類派生而來的。CWinThread類用來完成對線程的控制,包括線程的創(chuàng)建、運行、終止和掛起等。 CDocument:是文檔類,包含了應用程序運行期間所用到的數(shù)據(jù)。 CWnd:是一個通用的窗口類,用來提供Windows中的所有通用特性、對話框和控件。 一個MFC程序,必須包含一個派生自CWinApp的線程類,即C*App類,每一個MFC框架程序中都有且只有一個C*App的全局變量(對象)即theApp。 MFC正是利用類的這種"自動調(diào)用相應的構(gòu)造函數(shù)"特性,使得WinMain()函數(shù)的調(diào)用變成了應用程序框架內(nèi)部的調(diào)用,所以我們在代碼中看不到每個Windows程序所必須有的WinMain()函數(shù)。C++規(guī)定,全局對象的構(gòu)建將比程序進入點(在dos環(huán)境下為main,在Windows環(huán)境為WinMain)更早。所以theApp的構(gòu)造函數(shù)將更早與main。 C++中子類的構(gòu)造函數(shù)執(zhí)行在父類之后。系統(tǒng)執(zhí)行theApp的夠造函數(shù)時,先調(diào)用基類(CObject-->....CWinApp)的構(gòu)造函數(shù),進行一系列的內(nèi)部初始化操作,然后自動調(diào)用C*App的虛函數(shù)InitInstance(),該函數(shù)會進一步調(diào)用相應的函數(shù)來完成主窗口的構(gòu)造和顯示工作。下面來看看上述程序中InitInstance的執(zhí)行過程。
首先執(zhí)行的是: m_pMainWnd = new CMainFrame; 該語句用來創(chuàng)建從CFrameWnd類派生而來的用戶框架窗口CMainFrame類對象,繼而調(diào)用該類的構(gòu)造函數(shù),使得Create函數(shù)被調(diào)用,完成了窗口創(chuàng)建工作。 然后執(zhí)行后面兩句: m_pMainWnd->ShowWindow(m_nCmdShow); 用作窗口的顯示和更新。接下來調(diào)用: m_pMainWnd->MessageBox("你好,歡迎進入MFC世界!"); 最后返回TRUE,表示窗口創(chuàng)建成功。 InitInstance()完成初始化工作之后,接下來就是調(diào)用基類CWinApp的成員函數(shù)Run(),執(zhí)行應用程序的消息循環(huán),即重復執(zhí)行接收消息并轉(zhuǎn)發(fā)消息的工作。當Run()檢查到消息隊列為空時,將調(diào)用基類CWinApp的成員函數(shù)OnIdle進行空閑時的后臺處理工作。若消息隊列為空且又沒有后臺工作要處理時,則應用程序一直處于等待狀態(tài),一直等到有消息為止。 當程序結(jié)束后,調(diào)用基類CWinApp的成員函數(shù)ExitInstance(),完成終止應用程序的收尾工作。這就是MFC應用程序的運行機制。 |
|
|