CWinApp (應用程序對象) CFrameWnd (框架窗口)
├── 單例,進程級 ├── 繼承 CWnd → 擁有 HWND
├── 管理消息泵 ├── 封裝 CreateWindow/ShowWindow
├── InitInstance() → 創建主窗口 ├── 封裝消息映射宏
├── Run() → 消息循環 └── MDI: CMDIFrameWnd / CMDIChildWnd
└── ExitInstance() → 清理
#include // MFC 核心頭文件
// 1. 自定義框架窗口類
class CMyFrame : public CFrameWnd {
public:
CMyFrame() {
// 創建窗口:類名 NULL 使用默認 "Afx:...",標題 "MFC Window"
Create(NULL, _T("MFC Window"));
// 構造函數中彈出對話框演示
MessageBox(_T("My MFC Window"), _T("CFrame Constructor"), MB_OK);
}
};
// 2. 自定義應用程序類
class CMyApp : public CWinApp {
public:
virtual BOOL InitInstance() {
MessageBox(NULL, _T("My MFC Window"), _T("InitInstance"), MB_OK | MB_ICONASTERISK);
// 動態創建主窗口對象 (堆上)
CMyFrame* pFrame = new CMyFrame();
// 關鍵:賦值給 m_pMainWnd
// 1) 讓框架知道主窗口,Run() 會自動 ShowWindow/SW_SHOW
// 2) 防止 InitInstance 結束時棧上對象銷毀導致窗口消失
m_pMainWnd = pFrame;
// 最大化顯示
pFrame->ShowWindow(SW_SHOWMAXIMIZED);
pFrame->UpdateWindow();
return TRUE; // 繼續運行消息循環
}
virtual int ExitInstance() {
MessageBox(NULL, _T("My Window"), _T("ExitInstance"), MB_OK | MB_ICONHAND);
return CWinApp::ExitInstance();
}
};
// 3. 全局唯一應用程序對象 (程序入口)
CMyApp theApp; // main() / WinMain() 隱藏在 MFC 庫中,自動構造 theApp → InitInstance() → Run()
// 定義在 CWinThread (CWinApp 基類)
public: CWnd* m_pMainWnd;
BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CWnd* pParentWnd = NULL,
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL);
int CWinApp::Run() {
if (!InitInstance()) return FALSE;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return ExitInstance();
}
| 誤區 | 正確理解 |
|---|---|
| 以為 `CMyFrame` 構造函數結束窗口就創建好了 | `Create()` 才真正創建系統窗口 (HWND),構造函數僅初始化 C++ 對象 |
| 以為 `m_pMainWnd` 是靜態/全局變量 | 它是 `CWinThread` 實例成員,`theApp` 是全局唯一實例 |
| 在 `InitInstance` 返回前 `delete pFrame` | **絕對禁止**,`m_pMainWnd` 持有所有權,框架負責銷毀 |
| 以為 `MessageBox` 在構造函數中阻塞會影響窗口創建 | 構造函數中 `Create()` 已完成,`MessageBox` 只阻塞當前線程,窗口已存在 |
| 不配置 "Use MFC" 直接編譯 | 鏈接失敗,缺少 MFC 入口庫與 CRT 線程支持 |
真實 MFC 應用通常繼承 `CWinApp` → `AddDocTemplate` 註冊 `CSingleDocTemplate` / `CMultiDocTemplate`,包含:
下一講將詳細講解文檔/視圖架構、消息映射、資源管理與對話框編程。
MFC 的靈魂在於 **`CWinApp` 管理應用生命週期與消息泵**,**`CFrameWnd` 封裝窗口創建與消息分發**,**`m_pMainWnd` 連接兩者**。掌握最小程序的每一行代碼含義,是理解 MFC 文檔/視圖、消息映射、動態創建、序列化等高級機制的基石。