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

MFC 視圖類體系完整解析:CView、CScrollView、CFormView、CTreeView、CListView、CEditView、CRichEditView 功能對比與選型指南

     編輯:關於C語言

MFC 文檔/視圖架構提供七種視圖基類,針對不同應用場景封裝專用功能。本文系統對比所有視圖類核心能力、適用場景、關鍵接口及選型決策樹,助力架構設計快速決策。

一、 視圖類繼承體系

CObject
└── CCmdTarget
    └── CWnd
        └── CView (基類)
            ├── CScrollView      // 滾動支持
            ├── CFormView        // 對話框式佈局
            ├── CTreeView        // 樹形控件封裝
            ├── CListView        // 列表控件封裝
            ├── CEditView        // 編輯控件封裝
            └── CRichEditView    // 富文本編輯封裝

二、 七大視圖類詳細對比

視圖類核心封裝關鍵獲取接口適用場景特殊能力
CView無 (純虛繪製)-自定義繪圖、遊戲畫面、圖表渲染完全控制 OnDraw,打印/預覽自動遞送 DC
CScrollView滾動邏輯-大畫布、文檔瀏覽、地圖編輯器SetScrollSizes() 設置邏輯尺寸/映射模式/頁面行大小
CFormView對話框模板-數據錄入表單、屬性頁、配置向導DDX/DDV 數據交換,UpdateData() 雙向綁定
CTreeViewCTreeCtrlGetTreeCtrl()文件系統、組織架構、導航面板自動創建樹控件填充客戶區
CListViewCListCtrlGetListCtrl()數據表格、文件列表、郵件清單報表模式多列、圖標列表切換
CEditViewCEditGetEditCtrl()純文本編輯器、日誌查看器、代碼編輯完整編輯功能,SetPrinterFont() 打印字體
CRichEditViewCRichEditCtrlGetRichEditCtrl()Word 風格編輯器、RTF 文檔、郵件撰寫字體/顏色/段落/圖片/表格/UNDO/打印排版

三、 關鍵接口深度解析

1. CScrollView:滾動尺寸設置

void SetScrollSizes(int nMapMode, SIZE sizeTotal, 
                    const SIZE& sizePage = sizeDefault, 
                    const SIZE& sizeLine = sizeDefault);
  • nMapMode:映射模式 (MM_TEXT/MM_HIMETRIC/MM_ANISOTROPIC 等)
  • sizeTotal:文檔總邏輯尺寸 (決定滾動範圍)
  • sizePage:頁面滾動增量 (通常 = 視口尺寸 * 0.9)
  • sizeLine:行滾動增量 (通常 = 字體高度或固定值)

2. CFormView:數據交換機制

// DoDataExchange 中綁定
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Check(pDX, IDC_CHECK_ACTIVE, m_bActive);
DDX_Control(pDX, IDC_COMBO_TYPE, m_comboType);

// 雙向同步
UpdateData(TRUE);  // UI → 變量 (保存/驗證前)
UpdateData(FALSE); // 變量 → UI (初始化/刷新後)

3. 控件視圖獲取底層控件引用

// CTreeView
CTreeCtrl& tree = GetTreeCtrl();
tree.InsertItem(_T("Root"));

// CListView
CListCtrl& list = GetListCtrl();
list.InsertColumn(0, _T("Name"), LVCFMT_LEFT, 200);

// CEditView
CEdit& edit = GetEditCtrl();
edit.SetWindowText(_T("Content"));

// CRichEditView
CRichEditCtrl& rich = GetRichEditCtrl();
rich.SetSelectionCharFormat(cf);

四、 選型決策樹

需要何種核心交互?
├── 純自定義繪圖 (圖表/遊戲/圖形編輯) → CView
├── 大畫布需滾動 (地圖/長文檔/時間軸) → CScrollView
├── 表單式數據錄入 (對話框風格/綁定變量) → CFormView
├── 層級樹狀導航 (目錄/組織/分類) → CTreeView
├── 表格/列表數據展示 (多列/圖標/選擇) → CListView
├── 純文本編輯 (代碼/日誌/筆記) → CEditView
└── 富文本編輯 (字體/圖片/表格/排版/打印) → CRichEditView

五、 進階組合模式

1. 分割視圖

// CSplitterWnd 在 CFrameWnd 中創建
m_wndSplitter.CreateStatic(this, 1, 2); // 1行2列
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTreeView), size, pContext); // 左側導航樹
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CListView), size, pContext); // 右側列表

2. 多視圖單文檔

// 文檔模板註冊多視圖
CSingleDocTemplate* pTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CMyDoc),
    RUNTIME_CLASS(CMainFrame),
    RUNTIME_CLASS(CMyView)); // 主視圖

// 運行時動態創建第二視圖
CView* pView2 = pTemplate->CreateNewView(pDoc);

3. 視圖切換 (同一框架不同視圖)

// 在框架中切換視圖
CView* pOld = GetActiveView();
CView* pNew = (CView*)RUNTIME_CLASS(CAnotherView)->CreateObject();
pNew->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rect, this, AFX_IDW_PANE_FIRST, pContext);
SetActiveView(pNew);
pOld->DestroyWindow();

六、 打印/預覽架構統一性

核心優勢:所有視圖類統一通過 OnDraw(CDC* pDC) 繪製:

  • 屏幕顯示:pDC = 顯示 DC
  • 打印預覽:pDC = CPreviewDC (模擬打印機分辨率)
  • 實際打印:pDC = 打印機 DC

一次編寫 OnDraw,三端同步輸出 (WYSIWYG)。

七、 避坑指南

  1. CScrollView 坐標轉換:滾動時邏輯/設備座標轉換,鼠標點擊需 OnPrepareDC 或 DPtoLP
  2. CFormView Tab 順序:資源編輯器中正確設置 Tab Order,否則鍵盤導航混亂
  3. CRichEditView 依賴 CRichEditDoc:必須配套使用,單獨用會崩潰
  4. 視圖銷毀順序:文檔關閉時視圖先銷毀,OnDestroy 中釋放資源
  5. 映射模式一致性:CScrollView 設置映射模式後,OnDraw 內繪圖代碼必須使用邏輯座標

本文整理自 MFC 經典技術文檔,適用於 VC6~VS2022 所有版本。

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