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

《VC++技術內幕》學習筆記(二):MFC 應用程式框架優勢、文檔/視圖架構、手寫最小 MFC 程式

     編輯:VC++

Day 2 核心主題:Microsoft 基礎類庫應用程式框架

MFC 四大核心優勢(書本觀點 + 實戰體會)

優勢書本描述雷神實戰體會
標準化結構應用程式採用標準化結構團隊協作時,新成員一天即可上手專案架構
程式碼精簡、執行快動態連結 MFC DLL,應用程式極小Release 版僅 100KB 左右,但依賴系統 MFC DLL (需部署合併模塊)
VC++ 工具降低編碼複雜度AppWizard/ClassWizard/Resource Editor 三位一體比純 SDK 手寫 RegisterClass/CreateWindow 快 10 倍以上
類庫功能極豐富涵蓋集合、資料庫、網絡、OLE、打印...避免重複造輪子;但也導致「只會用 Wizard 不懂底層」的假高手

編程武功心法:內功、基本功、招式

  • 內功:C/C++ 語言精髓、面向對象設計原則 (SOLID)、設計模式。
  • 基本功:Win32 API (窗口、GDI、內核對象、線程同步、COM) —— **任何 Windows 開發 (VC/Delphi/CBuilder/VB/C#) 的共同基石**。
  • 招式:MFC、WTL、ATL、Qt、WinForms、WPF... 工具隨時代更迭,內功基本功決定上限。

真正的高手:內功深厚、基本功扎實、招式隨心所欲、無招勝有招。

從零手寫最小 MFC 程式 (對比 AppWizard 生成)

步驟 1:建立 Win32 Application 專案 (非 MFC)

Project → Settings → General → **Use MFC in a Static Library** (靜態鏈接,無需部署 DLL,適合學習)。

步驟 2:新增 MyApp.h / MyApp.cpp

// MyApp.h
class CMyApp : public CWinApp {
public:
    virtual BOOL InitInstance();
};

class CMyFrame : public CFrameWnd {
public:
    CMyFrame();
protected:
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
};

// MyApp.cpp
#include 
#include "MyApp.h"

CMyApp theApp; // 全局應用程式對象

BOOL CMyApp::InitInstance() {
    m_pMainWnd = new CMyFrame();
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()
    ON_WM_PAINT()
END_MESSAGE_MAP()

CMyFrame::CMyFrame() {
    Create(NULL, "MYAPP Application"); // 創建窗口
}

void CMyFrame::OnLButtonDown(UINT nFlags, CPoint point) {
    TRACE("Entering CMyFrame::OnLButtonDown - %lx,%d,%d\n", nFlags, point.x, point.y);
}

void CMyFrame::OnPaint() {
    CPaintDC dc(this);
    dc.TextOut(0, 0, "Hello World!");
}

關鍵元素解析

  1. CWinApp 派生類 CMyApp 的全局對象 theApp 是程式入口點;MFC 隱藏的 WinMain 會尋找並調用它。
  2. InitInstance:重寫此虛函數完成主窗口構造、顯示、更新。
  3. CWinApp::Run (基類隱藏) 負責消息循環 (相當於 SDK 的 GetMessage/DispatchMessage)。
  4. CFrameWnd 派生類 CMyFrame 代表主窗口;構造函數調用 Create 完成窗口創建。
  5. 消息映射宏 BEGIN_MESSAGE_MAP / ON_WM_* / END_MESSAGE_MAP 將 WM_LBUTTONDOWN、WM_PAINT 映射到成員函數。
  6. OnPaint 中使用 CPaintDC (自動 BeginPaint/EndPaint) 繪製文字;若放在 OnLButtonDown 則最小化恢復後文字消失 (因無 WM_PAINT 重繪)。
  7. 關閉流程:用戶關閉 → WM_CLOSE → DestroyWindow → WM_DESTROY → PostQuitMessage → 退出 Run → 刪除 theApp。

AppWizard 生成的單文檔程式:只需一行代碼顯示文字

  1. New → MFC AppWizard (exe) → Single Document → 其餘默認。
  2. Class View → CMyApp01View → OnDraw → 添加一行:
    pDC->TextOut(10, 10, "雷神願意和所有學VC的朋友共同進步!");
  3. 編譯運行:擁有完整菜單、工具列、狀態列、關於對話框、列印預覽... **零代碼實現標準 Windows 程式框架**。

文檔/視圖架構初認知

**文檔 (Document)** ≈ 後台數據模型 (數據庫、內存數據結構)。
**視圖 (View)** ≈ 前台展示界面 (繪圖、編輯、打印)。
**同一文檔可對應多視圖** (如同一數據同時以表格、圖表、報表顯示);文檔變更自動通知所有視圖更新。這是 MFC 核心設計模式,也是「關注點分離」在 Windows 桌面開發的經典實踐。

雷神建議:手敲百遍,改千遍

  • 所有書本示例、Wizard 生成代碼,**親手敲入**,感受編譯錯誤、鏈接錯誤、運行錯誤的完整循環。
  • 每敲一個示例,**主動修改** 字串、顏色、座標、邏輯分支,驗證理解。
  • 遇到不懂的 API、宏、虛函數,**立即查 MSDN** (F1),養成查閱官方文檔習慣。

下一篇預告

Day 3:消息映射機制深度解析、視圖類 CView 核心虛函數、OnDraw 繪圖實戰、Source Browser 看類全貌。

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