MFC 最核心的封裝是 Win32 API → C++ 類。理解 MFC Object (C++ 物件) 與 Windows Object (核心物件,由句柄標識) 的關係,是掌握 MFC 的鑰匙。
| 維度 | MFC Object (C++ 物件) | Windows Object (核心物件) |
|---|---|---|
| 本質 | C++ 類別實例(CWnd、CDC、CFile…) | 作業系統內部資料結構(視窗、DC、檔案、執行緒…) |
| 標識 | this 指標 | 句柄 (HWND、HDC、HANDLE) |
| 建立者 | 程式設計師(new 或棧上建構) | 系統 API (CreateWindow、CreateDC、CreateFile…) |
| 銷毀者 | 建構函數/離開作用域 | 系統 API (DestroyWindow、DeleteDC、CloseHandle…) |
| 關聯方式 | 成員變數 m_hWnd、m_hDC 保存句柄 | 系統內核維護物件表,句柄為索引 |
| 可見範圍 | 進程內、建立執行緒內(預設) | 系統全域可見,跨進程可傳遞 |
// 階段 1:建立 C++ 物件,句柄尚無效
CWnd* pWnd = new CMyWnd; // 呼叫 CWnd::CWnd(),m_hWnd = NULL
// 階段 2:建立 Windows 物件,綁定句柄
pWnd->Create(...); // 內部呼叫 CreateWindowEx,取得 HWND 存入 m_hWnd
// 或
pWnd->SubclassWindow(hWnd); // 關聯現有 HWND
關鍵點:
CDC 等 GDI 類別在建構函數中即建立 DC(GetDC/CreateCompatibleDC),屬特例。DestroyWindow()、Close() 等。| 方向 | 方法 | 說明 | |
|---|---|---|---|
| MFC → Handle | GetSafeHandle() | 傳回 m_hWnd,若物件無效傳回 NULL。 | |
| Handle → MFC (永久) | Attach(hWnd) | 將句柄所有權轉移給 MFC 物件,析構時會銷毀 Windows 物件。 | |
| Handle → MFC (臨時) | FromHandle(hWnd) | 建立臨時 MFC 物件(CTempWnd),閒置時自動刪除,不銷毀 Windows 物件。 |
| Windows Object | Handle 類型 | MFC 類別 | 關鍵成員 |
|---|---|---|---|
| 視窗 | HWND | CWnd | m_hWnd |
| 裝置內容 | HDC | CDC | m_hDC, m_hAttribDC |
| GDI 物件 | HGDIOBJ | CGdiObject | m_hObject |
| 筆刷 | HBRUSH | CBrush | → CGdiObject |
| 字型 | HFONT | CFont | → CGdiObject |
| 位圖 | HBITMAP | CBitmap | → CGdiObject |
| 選單 | HMENU | CMenu | m_hMenu |
| 檔案 | HANDLE | CFile | m_hFile |
| 執行緒 | HANDLE | CWinThread | m_hThread |
| 進程 | HANDLE | (無直接封裝) | - |
Create/SubclassWindow/Open 建立/關聯 Windows 物件。DestroyWindow/Close 釋放系統資源,再 delete C++ 物件(或離開作用域)。PostMessage(hWnd, WM_USER+X, ...),由 UI 執行緒處理。Attach。MFC 物件是 Windows 核心物件的智慧型包裝器:管理句柄生命週期、提供型別安全介面、整合訊息映射與診斷支援。深刻理解「C++ 物件 ≠ 核心物件」、「兩階段建構」、「執行緒親和性」、「臨時/永久映射」四大核心概念,能讓您避開 90% 的 MFC 資源洩漏、崩潰與跨執行緒 Bug。