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

VC++ 精華教程:MFC 入門系列(六)—— GDI 繪圖與無效區域機制

     編輯:VC++

作者:zhoujiamurong | 郵箱:zhoujiamurong@163.com
版權所有,轉載請聯繫作者。

前言:什麼是 GDI?

GDI (Graphics Device Interface) 是 Windows 提供的繪圖抽象層。面對顯示器、印表機等不同輸出設備,GDI 通過設備上下文 (DC, Device Context) 屏蔽硬體差異,讓程式碼無需關心具體驅動即可跨設備繪圖——類似 Java 虛擬機屏蔽平台差異。

準備工作:擴展菜單與工具欄

新增繪圖菜單

新增五個菜單項:直線、矩形、圓角矩形、圓、曲線,ID 分別為 ID_DRAW_LINE 等。工具欄同步添加對應按鈕,並啟用停靠功能:

// OnCreateClient 中工具欄升級
UINT toolIDs[] = { 0, ID_DISPLAY_DOWN, ID_DISPLAY_UP, ID_DISPLAY_RIGHT,
                   ID_DISPLAY_LEFT, 0,
                   ID_DRAW_LINE, ID_DRAW_RECT, ID_DRAW_ROUND_RECT,
                   ID_DRAW_CIRCLE, ID_DRAW_CURVE };

m_wndToolBar.CreateEx(this, TBSTYLE_FLAT,
    WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
m_wndToolBar.LoadBitmap(IDB_BITMAP1);
m_wndToolBar.SetButtons(toolIDs, 11);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar, AFX_IDW_DOCKBAR_TOP);

核心概念:無效區域與 WM_PAINT

Windows 為了效率,不重繪整個窗口,而是標記無效區域。當區域無效時,系統發送 WM_PAINT,MFC 映射為 ON_WM_PAINT() → OnPaint()。所有繪圖邏輯集中在 OnPaint 中。

實現橡皮筋效果畫線

1. 成員變量

class CMainFrame : public CFrameWnd {
    // ...
    CPoint m_ptStart;   // 起始點
    CPoint m_ptEnd;     // 終止點
    CRect  m_rectInvalid; // 無效矩形區域
};

2. 滑鼠按下:記錄起點

void OnLButtonDown(UINT nFlags, CPoint point) {
    m_ptStart = point;
}

3. 滑鼠釋放:記錄終點並觸發重繪

void OnLButtonUp(UINT nFlags, CPoint point) {
    m_ptEnd = point;
    // 構建包含兩點的矩形
    m_rectInvalid.SetRect(m_ptStart, m_ptEnd);
    m_rectInvalid.NormalizeRect(); // 確保 left

4. OnPaint:實際繪圖

void OnPaint() {
    CPaintDC dc(this); // 自動 BeginPaint/EndPaint
    dc.MoveTo(m_ptStart);
    dc.LineTo(m_ptEnd);
}

關鍵類說明

  • CPaintDC:專用於 OnPaint 的 DC 類,構造時自動 BeginPaint,析構時 EndPaint,確保繪圖區域正確驗證。
  • InvalidateRect:將矩形加入無效區域隊列,觸發 WM_PAINT。
  • MoveTo/LineTo:GDI 基本繪圖函數,通過 DC 發送給驅動程式。

運行效果

按下滑鼠左鍵拖動釋放,即在釋放處畫出一條直線。這是繪圖程序的雛形,下一節將擴展支持多種圖形與持久化。

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