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

《VC++ 技術內幕》學習筆記(三):訊息映射與視圖類——CView 核心、OnDraw 繪圖與 Source Browser 追蹤繼承

     編輯:VC 教學

MFC 訊息映射機制

MFC 使用巨集將訊息對應至成員函數,優點:

  • 允許非視窗類別 (如文件類) 處理命令訊息。
  • 無需 C++ 語言擴充,純標準 C++ 實現。
  • ClassWizard 自動生成代碼,可見、可維護。

訊息映射三步驟 (ClassWizard 自動完成)

  1. 標頭檔:afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  2. 實作檔:void CMyView::OnLButtonDown(...) { ... }
  3. 訊息映射:
    BEGIN_MESSAGE_MAP(CMyView, CView)
        ON_WM_LBUTTONDOWN()
    END_MESSAGE_MAP()
  4. 類別宣告:DECLARE_MESSAGE_MAP()

文件/視圖架構核心

  • 文件 (CDocument):資料模型,負責資料儲存、序列化、修改標記。
  • 視圖 (CView):顯示介面,負責繪製、使用者互動、轉發命令給文件。
  • 同一文件可關聯多視圖 (分割視窗),資料變更自動通知所有視圖更新。

視圖類別 CView 追蹤 (Source Browser)

  1. ClassView 中右鍵 CMyApp01View → Go to Definition 或 Alt+F12。
  2. 選擇 Base Classes and Members。
  3. 可見完整繼承鏈:CObject → CCmdTarget → CWnd → CView → CMyApp01View。
  4. 列出所有繼承成員函數 (ClassView 僅顯示本類別成員)。

OnDraw 繪圖核心

應用程式架構在需重繪時呼叫 virtual void OnDraw(CDC* pDC)。

  • pDC:裝置環境指標,封裝 HDC,提供 TextOut, Ellipse, Rectangle, BitBlt 等繪圖函數。
  • 同一 OnDraw 服務螢幕、列印預覽、實際列印 (傳入不同 CDC 衍生物件)。

AppWizard 專案實戰:繪製文字與圖形

  1. 建立 MFC AppWizard (exe) 專案 MyApp01,單文件。
  2. ClassView 開啟 CMyApp01View::OnDraw。
  3. 加入代碼:
    void CMyApp01View::OnDraw(CDC* pDC)
    {
        CMyApp01Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        pDC->TextOut(10, 10, _T("雷神願意和所有學 VC 的朋友共同進步!"));
        pDC->SelectStockObject(DKGRAY_BRUSH);
        pDC->Ellipse(CRect(20, 40, 120, 140));   // 圓
        pDC->Rectangle(CRect(220, 40, 320, 140)); // 矩形
    }
  4. 編譯執行,視窗顯示文字、灰色圓形與矩形。

專案檔案結構

檔案用途
MyApp01.dsp/.dsw專案/工作區檔案
MyApp01.rc資源描述檔
MyApp01View.h/.cpp視圖類別核心 (重點)
MyApp01Doc.h/.cpp文件類別
StdAfx.h/.cpp預編譯標頭
resource.h資源 ID 定義
ReadMe.txt專案說明

學習建議

  • 親手敲寫 OnDraw 代碼,體驗 CDC 繪圖函數。
  • 修改文字內容、座標、筆刷顏色觀察效果。
  • 使用 Source Browser 追蹤 CView 繼承鏈,理解 MFC 類別庫架構。
  • 閱讀 MFC 原始碼 (VC98\MFC\SRC\view.cpp) 看 OnDraw 如何被架構呼叫。

掌握訊息映射、文件/視圖分離與 OnDraw 繪圖流程,即掌握 MFC 應用程式開發的心臟部位。

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