首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

MFC 核心架構筆記:文檔/視圖架構、物件模型與預編譯頭

     編輯:關於C語言

MFC 宏觀類別體系

MFC 是 C++ 類別庫,程式設計師透過使用、繼承、擴充適當類別實現功能。核心架構對應:

應用角色MFC 基類典型衍生類
應用程式物件CWinAppCTApp
文檔物件CDocumentCTDoc
視圖物件CViewCTView
主框架視窗(MDI)CMDIFrameWndCMainFrame
子框架視窗(MDI)CMDIChildWndCChildFrame

包含:應用程式、文檔、視圖、主框架(選單、工具列、狀態列)、子框架(文檔視窗)。

預編譯頭(Precompiled Header)機制

  • 將專案常用 MFC 標準頭檔預先編譯,後續編譯直接載入結果,大幅加快建置速度。
  • 透過編譯 stdafx.cpp 生成 專案名.pch。
  • 編譯器視 #include "stdafx.h" 為分界線:之前的程式碼視為已預編譯(跳過),之後的程式碼正常編譯。
  • 因此 #include "stdafx.h" 必須是每個 .cpp 的第一行非註釋程式碼。

MFC 物件 vs Windows 物件(SDK 物件)

維度MFC 物件Windows 物件
資料結構C++ 類別實例(堆疊/堆積)系統內部結構,透過 Handle(句柄)參考
層次高層,封裝大部分功能低層,SDK API 直接操作
建立建構函式(程式碼直接 new/定義)SDK 函式(CreateWindow 等)
生命週期建構 → 成員函式建立對應 Windows 物件(Handle 變有效) → 解構函式銷毀SDK 函式建立/銷毀
可見範圍進程內、執行緒內(跨執行緒不可直接用)系統全域可見(跨進程可用 Handle 通訊)
銷毀解構函式自動清理需對應 SDK 函式釋放(DC 需 ReleaseDC 而非銷毀)

關鍵轉換規律

  1. 先建 MFC 物件(Handle 為空/無效)。
  2. 呼叫 MFC 成員函式(如 Create、CreateEx)建立對應 Windows 物件,Handle 寫入 MFC 物件成員變數(如 m_hWnd)。
  3. 後續操作透過 MFC 成員函式,間接呼叫 SDK API。
  4. 銷毀時 MFC 解構函式負責呼叫 SDK 釋放函式。

SDK 風格程式設計回顧

int WINAPI WinMain(...) {
    WNDCLASS wc = { ... };
    RegisterClass(&wc);
    HWND hWnd = CreateWindow(...);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

MFC 將上述流程封裝於 CWinApp::Run、CFrameWnd 等類別中,開發者專注於衍生類別的虛函式覆寫(InitInstance、OnDraw 等)。

學習建議

  • 理解「雙重物件模型」是掌握 MFC 的鑰匙。
  • 預編譯頭配置錯誤是新手常見建置失敗原因,記住 stdafx.h 必須第一個 include。
  • SDI/MDI 文檔視圖架構雖經典,現代專案常改用對話框基底或 WTL/Qt,但理解其架構有助於維護舊專案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved