Microsoft Foundation Classes (MFC) 為 C++ 封裝 Windows API 的龐大類別階層,版本 4.0 含約 200 個類別。核心分類:
| 類別 | 核心功能 |
|---|---|
| 應用程式架構 | CWinApp, CWinThread, CCmdTarget, CObject |
| 視窗與控制項 | CWnd, CFrameWnd, CDialog, CView, CStatic, CButton, CListBox, CComboBox, CEdit, CScrollBar |
| 繪圖裝置 | CDC, CPen, CBrush, CFont, CBitmap, CRgn, CPalette |
| 文件/視圖 | CDocument, CView, CScrollView, CFormView |
| 集合容器 | CArray, CList, CMap, CStringArray, CPtrList... |
| 資料庫/網路 | CDatabase, CRecordset, CAsyncSocket, CSocket, CInternetSession |
| OLE/COM | COleServerDoc, COleClientItem, COleControl, COlePropertyPage |
CObject (根基類)
└─ CCmdTarget (命令目標/訊息路由)
└─ CWinThread (執行緒)
└─ CWinApp (應用程式)
└─ CWnd (視窗基底)
├─ CFrameWnd (框架視窗)
│ └─ CMDIFrameWnd / CMDIChildWnd (MDI)
├─ CDialog (對話方塊)
├─ CView (文件視圖)
└─ 控制項類別們...
// hello.cpp
#include // MFC 核心標頭:含所有類別、巨集、Windows API
// 1. 應用程式類別衍生
class CHelloApp : public CWinApp {
public:
virtual BOOL InitInstance(); // 覆寫初始化虛擬函數
};
CHelloApp HelloApp; // 2. 全域唯一實例 (關鍵!)
// 3. 主視窗類別衍生
class CHelloWindow : public CFrameWnd {
CStatic* m_pStatic; // 控制項指標成員
public:
CHelloWindow(); // 建構函數建立視窗與控制項
};
// 4. 應用程式初始化
BOOL CHelloApp::InitInstance() {
m_pMainWnd = new CHelloWindow(); // 建立主視窗
m_pMainWnd->ShowWindow(m_nCmdShow); // 顯示 (依啟動參數:正常/最小化/最大化)
m_pMainWnd->UpdateWindow(); // 強制立即重繪 (WM_PAINT)
return TRUE; // 成功
}
// 5. 視窗建構函數
CHelloWindow::CHelloWindow() {
// 5.1 建立框架視窗本身
Create(NULL, // 類別名稱:NULL=使用預設
_T("Hello World!"), // 標題列文字
WS_OVERLAPPEDWINDOW, // 樣式:標準可縮放視窗
CRect(0,0,200,200)); // 初始位置/大小 (螢幕座標)
// 5.2 建立靜態標籤控制項
CRect r(50, 80, 150, 150); // 相對客戶區座標
m_pStatic = new CStatic();
m_pStatic->Create(_T("hello world"),
WS_CHILD | WS_VISIBLE | SS_CENTER,
r, this); // this = 父視窗
}
afxwin.h 內部定義 WinMain 進入點CWinApp 建構函數自動註冊視窗類別、建立訊息迴圈HelloApp 實例建構時 → 呼叫 CWinApp::CWinApp() → 內部啟動機制InitInstance、ExitInstance 等虛擬函數m_pMainWnd = new CHelloWindow():建立主視窗 → 觸發視窗建構函數ShowWindow(m_nCmdShow):m_nCmdShow 來自啟動參數 (捷徑屬性可設最小化啟動等)UpdateWindow():送 WM_PAINT 讓視窗立即繪製,避免閃爍| 參數 | 範例值 | 說明 |
|---|---|---|
| lpClassName | NULL | NULL=使用 MFC 預設類別 (AfxRegisterWndClass) |
| lpWindowName | "Hello World!" | 標題列文字 |
| dwStyle | WS_OVERLAPPEDWINDOW | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |
| rect | CRect(0,0,200,200) | 螢幕絕對座標;用 rectDefault 讓 Windows 決定 |
new CStatic() 分配記憶體 → Create() 建立實際 HWNDWS_CHILD:子視窗,剪裁於父視窗客戶區WS_VISIBLE:初始可見SS_CENTER:文字置中CRect(50,80,150,150):相對父視窗客戶區左上角 (0,0)this:父視窗指標,建立父子關係常用分類:
| 分類 | 代表函數 |
|---|---|
| 視窗狀態 | ShowWindow, UpdateWindow, SetWindowPos, MoveWindow, GetClientRect, GetWindowRect |
| 訊息處理 | SendMessage, PostMessage, PostQuitMessage |
| 繪圖 | GetDC, ReleaseDC, BeginPaint, EndPaint, GetWindowDC |
| 子視窗管理 | SetParent, GetParent, GetDlgItem, GetWindow(GW_CHILD/HWNDNEXT) |
| 樣式修改 | ModifyStyle, ModifyStyleEx, GetStyle |
| 計時器 | SetTimer, KillTimer |
| 游標/圖示 | SetCursor, LoadCursor, SetIcon |
File → New → Projects → Win32 Applicationhello,路徑自訂An empty project (或 A simple Win32 application)File → New → Files → C++ Source File → hello.cppProject → Add To Project → Files → hello.cppProject → Settings → General → Microsoft Foundation Classes: "Use MFC in a Shared DLL"Build → Build hello.exe (或 Rebuild All)Build → Execute hello.exe 執行Debug → Start Debug,中斷點、變數觀察、呼叫堆疊ASSERT 條件失敗 → 斷點進入除錯器MFC Application 範本 (自動生成架構)_T() 或 L"" 宏strcpy → strcpy_s, sprintf → sprintf_s 等DWORD_PTR, LONG_PTR 替代 DWORD, LONG 儲存指標Hello World 雖小,五臟俱全:應用程式物件、框架視窗、控制項建立、訊息迴圈隱藏。後續章節將擴展:控制項樣式定制 (CStatic)、事件驅動程式設計 (訊息映射)、對話框/文件-視圖架構。掌握此核心骨架,即掌握 MFC 程式設計精髓。