2.運行機制
在程序中,當定義一個類對象時,它會自動調用相應的構造函數(shù)。所謂"類對象",就是用該類定義的"變量",這個"變量"又稱為類的一個實例。例如,theApp就是類CSimpApp的一個對象。
MFC正是利用類的這種"自動調用相應的構造函數(shù)"特性,使得WinMain()函數(shù)的調用變成了應用程序框架內部的調用,所以我們在代碼中看不到每個Windows程序所必須有的WinMain()函數(shù)。
當應用程序運行到"CSimpApp theApp;"時,系統(tǒng)就會先調用基類CWinApp構造函數(shù),進行一系列的內部初始化操作,然后自動調用CSimpApp的虛函數(shù)InitInstance(),該函數(shù)會進一步調用相應的函數(shù)來完成主窗口的構造和顯示工作。下面來看看上述程序中InitInstance的執(zhí)行過程。
首先執(zhí)行的是:
m_pMainWnd = new CMainFrame;
該語句用來創(chuàng)建從CFrameWnd類派生而來的用戶框架窗口CMainFrame類對象,繼而調用該類的構造函數(shù),使得Create函數(shù)被調用,完成了窗口創(chuàng)建工作。
然后執(zhí)行后面兩句:
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
用作窗口的顯示和更新。接下來調用:
m_pMainWnd->MessageBox("你好,歡迎進入MFC世界!");
最后返回TRUE,表示窗口創(chuàng)建成功。
由于應用程序類CWinApp是用來調用WinMain以及實例的初始化,因此每一個MFC應用程序有且只能一個這樣的應用程序類,且需要一個全局的對象實例,如上述程序中的theApp,當然也可換一個對象名。
InitInstance()完成初始化工作之后,接下來就是調用基類CWinApp的成員函數(shù)Run(),執(zhí)行應用程序的消息循環(huán),即重復執(zhí)行接收消息并轉發(fā)消息的工作。當Run()檢查到消息隊列為空時,將調用基類CWinApp的成員函數(shù)OnIdle進行空閑時的后臺處理工作。若消息隊列為空且又沒有后臺工作要處理時,則應用程序一直處于等待狀態(tài),一直等到有消息為止。
當程序結束后,調用基類CWinApp的成員函數(shù)ExitInstance(),完成終止應用程序的收尾工作。這就是MFC應用程序的運行機制。
3.MFC類結構
Visual C++發(fā)展至今,MFC類庫越來越強大,其基本層次結構如圖5所示,箭頭的方向是從派生類指向基類。
圖5 MFC類基本層次結構
其中,CObject類是MFC提供的絕大多數(shù)類的基類。該類完成動態(tài)空間的分配與回收,支持一般的診斷、出錯信息處理和文檔序列化等。
CCmdTarget類主要負責將系統(tǒng)事件(消息)和窗口事件(消息)發(fā)送給響應這些事件的對象,完成消息發(fā)送、等待和派遣(調度)等工作,實現(xiàn)應用程序的對象之間協(xié)調運行。
CWinApp類是應用程序的主線程類,它是從CWinThread類派生而來。CWinThread類用來完成對線程的控制,包括線程的創(chuàng)建、運行、終止和掛起等。
CDocument類是文檔類,包含了應用程序在運行期間所用到的數(shù)據(jù)。
CWnd類是一個通用的窗口類,用來提供Windows 中的所有通用特性。
CView 是用于讓用戶通過窗口來訪問文檔以及負責文檔內容的顯示。
CFrameWnd 類是從 CWnd 繼承來的,并實現(xiàn)了標準的框架應用程序。
CDialog 類用來控制對話框窗口。
CMDIFrameWnd和CMDIChildWnd類分別用來多文檔應用程序的主框架窗口和文檔子窗口的顯示和管理。
CMiniFrameWnd類是一種簡化的框架窗口,它沒有最大化和最小化窗口按鈕,也沒有窗口系統(tǒng)菜單,一般很少用到它。