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

《VC++技術內幕》學習筆記(三):消息映射機制、視圖類 CView、OnDraw 繪圖、映射模式初探

     編輯:VC++

Day 3 核心主題:消息映射與視圖類

MFC 消息映射:宏機制而非虛函數表

  • MFC 用宏 (DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP, ON_WM_*, END_MESSAGE_MAP) 將 Windows 消息 (WM_*) 映射到派生類成員函數 (On*)。
  • 優點:非窗口類 (如 CDocument) 也能處理命令消息;無需 C++ 語言擴展;ClassWizard 自動生成映射條目、函數原型、函數體框架。
  • 手動添加消息處理四步驟:
    1. 頭文件聲明 afx_msg void OnXxx(...);
    2. 類聲明中 DECLARE_MESSAGE_MAP()
    3. 實現文件 BEGIN_MESSAGE_MAP(CMyView, CView) ... END_MESSAGE_MAP()
    4. 實現 void CMyView::OnXxx(...) { ... }

文檔/視圖架構深度類比

文檔 = 後台數據庫 (數據模型、業務邏輯、持久化)。
視圖 = 前台界面 (繪圖、編輯控件、打印輸出)。
同一文檔可掛接多視圖:CSplitterWnd 動態分割、CMultiDocTemplate 多文檔多視圖。文檔變更調用 UpdateAllViews 通知所有視圖重繪。

視圖類 CView 核心認知

  • CView 派生自 CWnd,擁有幾百個成員函數。
  • 行為完全由成員函數決定:**既包含派生類特定函數,也包含基類標準函數** (OnDraw, OnInitialUpdate, OnPrepareDC, OnScroll*...)。
  • **必讀 MFC 源碼**:view.cpp, view.h, winmgr.cpp... 看多少算多少,不白看。

AppWizard 生成單文檔專案文件結構

OnDraw(CDC* pDC) 繪圖實戰

void CMyApp01View::OnDraw(CDC* pDC) {
    CMyApp01Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);

    // 1. 文字
    pDC->TextOut(10, 10, "雷神願意和所有學VC的朋友共同進步!");

    // 2. 選擇庫存刷子 (深灰)
    pDC->SelectStockObject(DKGRAY_BRUSH);

    // 3. 畫圓 (邏輯座標矩形)
    pDC->Ellipse(CRect(20, 40, 120, 140));

    // 4. 畫矩形
    pDC->Rectangle(CRect(220, 240, 120, 140)); // 注意: CRect(left, top, right, bottom)
}

CDC* pDC 是設備環境指針,封裝了 GDI 繪圖函數。所有繪圖操作均在邏輯座標系進行,映射模式決定邏輯→物理轉換 (下篇詳細講解)。

Source Browser 查看類全貌

  1. Class View 選中 CMyApp01View。
  2. Alt+F12 → Base Class and Members。
  3. 可見完整繼承鏈:CObject → CCmdTarget → CWnd → CView → CMyApp01View 及所有繼承來的虛函數、消息映射條目。
  4. Class View **不顯示基類成員**,Source Browser 才是查看類完整能力的正確工具。

映射模式初探:為何同樣 200x200 在不同解析度下大小不同?

預設 MM_TEXT:1 邏輯單位 = 1 像素。
1024x768 螢幕像素密度高,200 像素物理尺寸小;640x480 像素密度低,同樣 200 像素物理尺寸大。
**解決方案**:選擇固定比例映射模式 (MM_HIMETRIC 等) 或可變比例模式 (MM_ANISOTROPIC),實現「邏輯尺寸固定,物理尺寸自適應」。

雷神心法:動手實驗

  1. 在上一篇的 AppWizard 專案中,修改 OnDraw 加入上述繪圖代碼,觀察不同解析度下圖形大小變化。
  2. 用 Spy++ 觀察視窗接收的 WM_PAINT、WM_ERASEBKGND 消息頻率。
  3. 嘗試在 OnLButtonDown 中繪圖,最小化恢復後觀察消失現象,理解 OnPaint 的必要性。

下一篇預告

Day 4:資源文件 (.rc) 詳解、Debug/Release 兩種編譯模式、診斷宏 (TRACE, ASSERT, VERIFY)、調試工具 (Spy++, Dependency Walker, 斷點、單步、監視視窗)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
文件角色
MyApp01View.h / .cpp視圖類 CMyApp01View 定義與實現 **核心**
MyApp01Doc.h / .cpp文檔類 CMyApp01Doc 定義與實現
MainFrm.h / .cpp主框架窗口 CMainFrame
MyApp01.h / .cpp應用程式類 CMyApp01App
StdAfx.h / .cpp預編譯頭
Resource.h資源 ID 定義
MyApp01.rc資源腳本