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

VC++ 技術內幕筆記第 4 章:事件處理、映射模式與捲動視圖

     編輯:VC 教學

訊息映射機制

// .h
class CMyView : public CView {
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    DECLARE_MESSAGE_MAP()
};

// .cpp
BEGIN_MESSAGE_MAP(CMyView, CView)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
    // 點擊座標在 point
}

ClassWizard 維護 //{{AFX_MSG ...}} 註釋區塊,**手動編輯映射需在區塊外**。

文檔-視圖架構下的繪圖邏輯

  • OnDraw 根據**視圖狀態**繪圖;
  • 用戶操作 → 改變狀態 (文檔資料) → Invalidate → 觸發 OnDraw 重繪;
  • 多視圖共享同一文檔,狀態集中於文檔物件,避免全域變數衝突。

無效區優化重繪

  • InvalidateRect(&rect, TRUE):標記矩形無效,TRUE = 擦除背景;
  • OnDraw 內呼叫 pDC->GetClipBox(&rectClip) 取得實際裁剪區,**僅繪製與 rectClip 相交的物件**;
  • 視窗縮放/遮蔽恢復同樣觸發 WM_PAINT → OnDraw。

幾何測試與座標轉換

  • PtInRect(&rect, pt) / PtInRegion(rgn, pt);
  • GetClientRect(&rect) 取得客戶區;
  • SelectStockObject 選入預設筆/刷/字型;
  • 建構函數成員初始化列表:: m_rect(0,0,200,200), m_color(GRAY_BRUSH) {}。

MFC vs SDK 視窗程序架構

SDKMFC
註冊 WNDCLASS + 視窗程序指標統一視窗類 + 統一視窗程序 AfxWndProc
CreateWindow 綁定類名句柄映射表 HWND → CWnd*
視窗程序 switch(msg) 分派運行時類 + 靜態訊息映射表 → 成員函數

映射模式完整對照

**注意**:除 MM_TEXT 外,Y 軸方向與螢幕座標**相反** (符合笛卡兒習慣)。

座標轉換 API

  • SetViewportOrg(x,y) / GetViewportOrg():視口原點 (裝置座標);
  • SetWindowOrg(x,y) / GetWindowOrg():視窗原點 (邏輯座標);
  • DPtoLP(&pt) / LPtoDP(&pt):裝置↔邏輯單點轉換;
  • DPtoLP(&rect) / LPtoDP(&rect):矩形轉換。

捲動視圖 CScrollView 要點

  • 繼承 CScrollView,呼叫 SetScrollSizes(MM_TEXT, sizeTotal) 設定總大小;
  • OnDraw 直接用邏輯座標繪圖,框架自動處理捲動偏移;
  • OnPrepareDC 可調整捲動參數;
  • 捲動條訊息 (WM_HSCROLL/WM_VSCROLL) 由基類處理,無需手動映射。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式邏輯單位X 向Y 向用途
MM_TEXT1 像素右增下增裝置座標、位圖操作
MM_HIENGLISH0.001 inch右增**上增**高精度英制
MM_HIMETRIC0.01 mm右增**上增**高精度公制
MM_LOENGLISH0.01 inch右增**上增**低精度英制
MM_LOMETRIC0.1 mm右增**上增**低精度公制
MM_TWIPS1/1440 inch右增**上增**排版單位 (1 twip = 1/20 pt)