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

Visual C++ MFC 核心架構與 Hello World 程式深度剖析

     編輯:關於VC++

MFC 類別庫架構總覽

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/COMCOleServerDoc, COleClientItem, COleControl, COlePropertyPage

關鍵繼承鏈

CObject (根基類)
  └─ CCmdTarget (命令目標/訊息路由)
       └─ CWinThread (執行緒)
            └─ CWinApp (應用程式)
       └─ CWnd (視窗基底)
            ├─ CFrameWnd (框架視窗)
            │    └─ CMDIFrameWnd / CMDIChildWnd (MDI)
            ├─ CDialog (對話方塊)
            ├─ CView (文件視圖)
            └─ 控制項類別們...

MFC 應用程式設計流程

三大核心物件

  1. 應用程式物件 (CWinApp 衍生):唯一全域實例,處理初始化、訊息迴圈、命令路由
  2. 主視窗物件 (CFrameWnd 衍生):框架視窗,含標題列、選單、客戶區、最小化/最大化
  3. 使用者介面控制項:按鈕、編輯框、清單... 依應用需求組合

兩種建立控制項方式

  • 程式碼建立:教學、動態介面、簡單工具 — 本教程採用
  • 資源編輯器:對話框編輯器拖拉配置、產生 .rc 資源檔、ClassWizard 關聯變數 — 實務主流

Hello World 程式逐行剖析

// 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 = 父視窗
}

關鍵設計點深度解析

無 main()/WinMain() 的秘密

  • MFC 在 afxwin.h 內部定義 WinMain 進入點
  • CWinApp 建構函數自動註冊視窗類別、建立訊息迴圈
  • 全域 HelloApp 實例建構時 → 呼叫 CWinApp::CWinApp() → 內部啟動機制
  • 開發者只需覆寫 InitInstance、ExitInstance 等虛擬函數

InitInstance 三步驟

  1. m_pMainWnd = new CHelloWindow():建立主視窗 → 觸發視窗建構函數
  2. ShowWindow(m_nCmdShow):m_nCmdShow 來自啟動參數 (捷徑屬性可設最小化啟動等)
  3. UpdateWindow():送 WM_PAINT 讓視窗立即繪製,避免閃爍

CFrameWnd::Create 四參數

參數範例值說明
lpClassNameNULLNULL=使用 MFC 預設類別 (AfxRegisterWndClass)
lpWindowName"Hello World!"標題列文字
dwStyleWS_OVERLAPPEDWINDOWWS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
rectCRect(0,0,200,200)螢幕絕對座標;用 rectDefault 讓 Windows 決定

CStatic 建立細節

  • 兩階段建構:new CStatic() 分配記憶體 → Create() 建立實際 HWND
  • WS_CHILD:子視窗,剪裁於父視窗客戶區
  • WS_VISIBLE:初始可見
  • SS_CENTER:文字置中
  • CRect(50,80,150,150):相對父視窗客戶區左上角 (0,0)
  • this:父視窗指標,建立父子關係

CWnd 200+ 成員函數探索指南

常用分類:

分類代表函數
視窗狀態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

MFC 開發環境操作實務 (VC++ 6.0 經典流程)

建立專案步驟

  1. File → New → Projects → Win32 Application
  2. 專案名稱:hello,路徑自訂
  3. 專案類型:An empty project (或 A simple Win32 application)
  4. File → New → Files → C++ Source File → hello.cpp
  5. Project → Add To Project → Files → hello.cpp
  6. Project → Settings → General → Microsoft Foundation Classes: "Use MFC in a Shared DLL"
  7. Build → Build hello.exe (或 Rebuild All)
  8. Build → Execute hello.exe 執行

除錯技巧

  • 編譯錯誤:雙擊輸出視窗錯誤行跳轉原始碼
  • 連結錯誤 LNK2001:通常忘記設「Use MFC in a Shared DLL」
  • 執行時錯誤:Debug → Start Debug,中斷點、變數觀察、呼叫堆疊
  • Assert 失敗:ASSERT 條件失敗 → 斷點進入除錯器

遷移至現代 Visual Studio (2019/2022) 注意事項

  • 專案類型:MFC Application 範本 (自動生成架構)
  • 字元集:預設 Unicode (VC6 預設 MBCS) → 字串用 _T() 或 L"" 宏
  • 安全函數:strcpy → strcpy_s, sprintf → sprintf_s 等
  • Common Controls 6.0:需 Manifest 啟用視覺樣式
  • 64 位元支援:指標 64-bit,DWORD_PTR, LONG_PTR 替代 DWORD, LONG 儲存指標

結語

Hello World 雖小,五臟俱全:應用程式物件、框架視窗、控制項建立、訊息迴圈隱藏。後續章節將擴展:控制項樣式定制 (CStatic)、事件驅動程式設計 (訊息映射)、對話框/文件-視圖架構。掌握此核心骨架,即掌握 MFC 程式設計精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved