MFC (Microsoft Foundation Class Library) 是建立在 Win32 API 之上的 C++ 類別庫,提供應用程式框架,預先定義程式骨架、標準化使用者介面實作,開發者僅需透過預留介面填入業務邏輯。Visual C++ 提供 AppWizard、資源編輯器、ClassWizard 等工具輔助開發全流程。
CWnd 封裝 HWND,m_hWnd 儲存句柄,API 封裝為成員函式。CDocument 管理資料,CView 負責顯示與輸入轉換。CObject(RTTI、動態創建、序列化、診斷)。CCmdTarget 封裝訊息處理架構,所有可處理訊息的類別由此衍生。CWnd(視窗)、CWinThread(執行緒/應用程式)、CDocument(文檔)等。虛擬函式表膨脹問題:若每個 Windows 訊息對應一個虛擬函式,虛擬表過大。MFC 採用訊息映射機制,以高效查表方式實現動態繫結,配合虛擬函式提供豐富介面。
MFC 封裝應用程式概念為開發模板:SDI、MDI、一般 DLL、延伸 DLL、OLE/ActiveX 等。核心均採文檔-視圖為中心思想。
| 角色 | 基類別 | 衍生類別 (AppWizard 產生) | 說明 |
|---|---|---|---|
| 應用程式 | CWinApp | CTApp | 唯一實例,負責初始化/執行/結束 |
| 主框架視窗 | CMDIFrameWnd | CMainFrame | 包含工具列、狀態列、MDI 用戶區 |
| 文檔框架視窗 | CMDIChildWnd | CChildFrame | 包含視圖視窗 |
| 文檔 | CDocument | CTDoc | 管理資料,提供存取介面 |
| 視圖 | CView | CTView | 顯示資料,轉換使用者輸入 |
| 文檔模板 | CMultiDocTemplate | — | 管理上述物件創建 |
CWinApp → CMultiDocTemplate → CMDIFrameWnd (含 CToolBar/CStatusBar) → CMDIChildWnd → CView ↔ CDocument。所有類別最終繼承自 CObject,處理訊息者繼承自 CCmdTarget。
| 檔案 | 用途 |
|---|---|
| stdafx.h / stdafx.cpp | 預編譯標頭,加速建置 |
| resource.h | 資源 ID 定義 |
| t.h / t.cpp | 應用程式類別 CTApp 及全域 theApp |
| mainfrm.h / mainfrm.cpp | 主框架 CMainFrame |
| childfrm.h / childfrm.cpp | 文檔框架 CChildFrame |
| tdoc.h / tdoc.cpp | 文檔 CTDoc |
| tview.h / tview.cpp | 視圖 CTView |
包含依賴:t.cpp 包含所有使用者定義類別標頭;tview.cpp 需 tdoc.h;其餘實作檔多僅包含自身標頭。
stdafx.cpp 編譯產生 專案名.pch。.cpp 首行 #include "stdafx.h",編譯器跳過此行前代碼,直接使用 .pch。THIS_FILE 宏記錄檔名。