本文實作一個模擬 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衍生類別中重載三大滑鼠訊息:
- OnLButtonDown:建立對應圖元實例,記錄起始點。
- OnMouseMove:追蹤滑鼠移動,呼叫
MoveAt即時更新畫面(橡皮筋效果)。- OnLButtonUp:完成繪製,將圖元加入文件容器。
剪貼簿與撤銷/重做機制
OpenClipboard、SetClipboardData(CF_BITMAP, ...) 等 API,配合矩形選取區域實現剪切/複製/貼上。Stack,每次操作後以 SaveInStack() 將螢幕內容存為 HBITMAP。雖屬暴力法,但實作簡單且效果良好。利用 LoadImage 載入 BMP,BitBlt 繪製至裝置內容。轉為 ActiveX 控件步驟:
AddDocTemplate 掛載文件模板。GetFrameWnd()->GetActiveView() 取得視圖指標,轉發命令(如 OnEditCopy)。完成後可直接嵌入網頁或 VB/VC 容器中使用。