MFC常見面試問題(持續更新)
MFC(微軟基礎類)也是一種應用程式框架,定義了應用程式的一般處理流程,用於對Windows API實現基於面向物件技術的封裝,隱藏在Windows下使用C++程式設計的大量內部細節。在開發應用程式的過程中,程式設計人員可以通過對類庫中已有類的繼承,生成功能更加強大的類庫以供自己所用。
在MFC中類的層次結構(即繼承關係)如圖5-3所示。
從圖中可知,在MFC中大多數的類都派生於CObject類,它的主要作用是為子類提供一些基本的功能,這些派生類構成了MFC應用程式的基本框架,它們各自的功能描述如表5-1所示。
派生類 |
功能描述 |
CCmdTarget |
用於處理使用者請求 |
CWinThread |
代表應用程式內部的執行執行緒 |
CWinApp |
應用程式的核心 |
CWnd |
為所有的視窗類提供基本的功能,處理常見的系統訊息 |
CView |
用於顯示資料並與文件物件進行互動 |
CFrameWnd |
應用程式的主框架 |
CDocument |
包含應用程式的資料集 |
下面將對上述表中各個類的功能進行具體的講解。
1)CCmdTarget類
CCmdTarget類是MFC的訊息對映基礎類,MFC為該類設計了許多的成員變數及函式以解決訊息對映的問題。派生於CCmdTarget的類可用於處理當使用者選擇選單或單擊按鈕等操作時所產生的Command訊息。
在實際的開發過程中,我們通常很少直接從CCmdTarget中派生類。當想要生成一個處理按鍵訊息的類時,只需從繼承於CCmdTarget類的框架子類CView、CWinApp、CDocument、CWnd和CFrameWnd中選擇一個來充當父類即可。
2)CWinThread類
CWinThread類是MFC中用於封裝執行緒的類,它的成員函式可以使MFC應用程式建立和管理包括UI及工作者在內的執行緒。每個MFC應用程式都至少應該使用一個從CWinThread派生的類,應用程式類CWinApp就是一個代表。
3)CWinApp類
CWinApp類通常代表應用程式自己,它封裝了應用程式的初始化、執行及終止的過程。基於框架的應用程式必須有且僅有一個派生於CWinApp的類的物件,並在完成視窗的建立工作之前執行對該物件的構造。
應用程式類的物件需要完成以下工作。
初始化應用程式。
建立文件模板結構。
迴圈檢索訊息佇列中的訊息並將這些訊息傳送到指定的地方。
執行應用程式退出時的清理工作。
4)CDocument類
CDocument類是在使用文件/檢視結構的應用程式中文件物件的基類,它為應用程式的文件物件提供了基本的功能,包括新建、序列化資料等。
5)CWnd類
CWnd類是所有MFC 視窗的基類,它封裝了視窗的基本操作,包括視窗的建立、銷燬、設定視窗風格等,以及視窗對大部分訊息的預設響應。開發人員可以直接從CWnd派生其他類,但通常情況下我們並不這麼做,而是通過繼承CWnd的派生類生成新類。
6)CFrameWnd類
CFrameWnd類往往用於建立應用程式的主視窗,並定義了大量管理檢視和文件物件的成員函式及變數。在編寫文件/檢視結構的應用程式時,檢視物件等將作為CFrameWnd的子視窗實現對客戶區的共享,並被CFrameWnd有序排列。
7)CView類
CView類是在使用文件/檢視結構的應用程式中檢視物件的基類,它是使用者的主要操作介面。在應用程式中,一個檢視物件通常只對應一個文件物件,但一個文件物件卻可以關聯多個檢視物件,並且每個檢視物件都以不同的形式來顯示文件中的資料。
在上述CObject類的派生類中,CWinApp類、CDocument類、 CCmdTarget類及CWinThread類構成了應用程式的結構類,代表了應用程式的基本結構元素。換句話說,當一個應用程式開始執行時,這些類將最先實現初始化。
在類的層次結構中,應用程式類CWinApp是一個基於MFC應用程式的最外層物件容器,它不僅擁有諸如例項控制代碼等需要被傳送到WinMain()函式中去的引數,還包含了應用程式的主框架視窗,當主框架視窗被關閉時,應用程式也就跟著結束了。因此,開發人員必須為程式建立一個全域性的應用程式物件。