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

打造類 Windows 畫筆的 MFC 繪圖控件

     編輯:關於VC++

專案概覽

本文實作一個模擬 Windows 畫筆功能的 MFC 繪圖程式,支援直線、曲線、圓、橢圓、矩形、多邊形等基本圖元,並具備剪貼簿操作、撤銷/重做、BMP 檔案讀寫等功能。最終將其封裝為 ActiveX 控件,方便嵌入其他應用程式。

核心架構:圖元類別體系

所有圖元類別均繼承自基類 CDrawObject,統一管理顏色、線寬、填充模式等共同屬性,並定義虛擬函數 Draw、MoveAt、EndPoint 等,實現多型繪製與編輯:

class CDrawObject : public CObject {
    COLORREF m_PenColor;
    int      m_iPenWidth;
    bool     m_bFill;
public:
    bool     m_bSelected;
    long     m_nStyle;
    virtual void Draw(CDC* pDC) {}
    virtual void MoveAt(CDC* pDC, long x, long y) {}
    virtual void EndPoint(CDC* pDC) {}
    virtual void NewPoint(long x, long y) {}
    virtual int AddPoint(long x, long y) { return 0; }
    // ... 屬性存取函數
};

視圖類別中的互動邏輯

在 CView 衍生類別中重載三大滑鼠訊息:

  1. OnLButtonDown:建立對應圖元實例,記錄起始點。
  2. OnMouseMove:追蹤滑鼠移動,呼叫 MoveAt 即時更新畫面(橡皮筋效果)。
  3. OnLButtonUp:完成繪製,將圖元加入文件容器。

剪貼簿與撤銷/重做機制

  • 剪貼簿:使用 OpenClipboard、SetClipboardData(CF_BITMAP, ...) 等 API,配合矩形選取區域實現剪切/複製/貼上。
  • 撤銷/重做:自訂堆疊類別 Stack,每次操作後以 SaveInStack() 將螢幕內容存為 HBITMAP。雖屬暴力法,但實作簡單且效果良好。

檔案讀寫與 ActiveX 控件轉換

利用 LoadImage 載入 BMP,BitBlt 繪製至裝置內容。轉為 ActiveX 控件步驟:

  1. 建立 MFC ActiveX ControlWizard 專案。
  2. 引入原文件/視圖/框架類別原始碼。
  3. 在控件建構函數加入 AddDocTemplate 掛載文件模板。
  4. 透過 GetFrameWnd()->GetActiveView() 取得視圖指標,轉發命令(如 OnEditCopy)。
  5. 補充屬性頁(顏色、字型)並重新定義選單/工具列資源。

完成後可直接嵌入網頁或 VB/VC 容器中使用。

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