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

C# GDI+ 簡單繪圖(四):打造類 Windows 畫圖工具

     編輯:關於C#

專案概覽

實作功能:直線、矩形、圓形、橡皮擦、顏色切換、開啟/儲存圖片、清除畫布、手動調整畫布大小。啟動時為空白畫布,可直接繪圖或匯入圖片後繪製。

成品截圖

架構設計

  • 主視窗:負責 UI 配置、選單事件、畫布大小調整邏輯。
  • DrawTools 類別:封裝所有繪圖工具(鉛筆、橡皮、直線、矩形、圓形、實心矩形、實心圓形),降低耦合。

核心技術點

1. 雙重緩衝防止閃爍

使用兩個 Image 變數:

  • originalImg:保存已完成繪圖與背景。
  • finishingImg:繪製過程中暫存畫面(含正在拖曳的圖形)。
  • 滑鼠移動時:Clone originalImg → 繪製暫時圖形 → 繪至螢幕 → 釋放暫存圖片。
  • 滑鼠放開:將暫時圖形併入 originalImg。

2. 開啟圖片並支援另存覆蓋

直接指派 PictureBox.Image = Image.FromFile(path) 會鎖定檔案導致無法覆蓋存檔。解法:

Bitmap src = new Bitmap(openFileDialog.FileName);
Bitmap canvas = new Bitmap(src.Width, src.Height);
using (Graphics g = Graphics.FromImage(canvas)) {
    g.Clear(pictureBox.BackColor);
    g.DrawImage(src, 0, 0);
}
src.Dispose(); // 立即釋放檔案鎖定
pictureBox.Image = canvas; // 顯示副本
// 同步更新 DrawTools 參考的 originalImg 與 Graphics

3. 手動調整畫布大小

在畫布右下角放置 5x5 PictureBox (名為 reSize) 作為拖曳控制點。

bool _resizing = false;
void reSize_MouseDown(...) => _resizing = true;
void reSize_MouseMove(...) {
    if (_resizing) reSize.Location = new Point(reSize.Location.X + e.X, reSize.Location.Y + e.Y);
}
void reSize_MouseUp(...) {
    _resizing = false;
    // 計算新大小(考慮捲軸偏移)
    int newW = reSize.Location.X - panel.AutoScrollPosition.X;
    int newH = reSize.Location.Y - panel.AutoScrollPosition.Y;
    pictureBox.Size = new Size(newW, newH);
    // 重建 originalImg 並繪製現有內容
    Bitmap newCanvas = new Bitmap(newW, newH);
    using (Graphics g = Graphics.FromImage(newCanvas)) {
        g.Clear(Color.White);
        g.DrawImage(originalImg, 0, 0);
    }
    originalImg = newCanvas;
    // 更新 DrawTools 參考
}
調整畫布示意

選單功能實作

  • 開啟:上述雙重緩衝載入法。
  • 儲存:originalImg.Save(path, ImageFormat.Png/Jpeg/Bmp)。
  • 清除:Graphics.FillRectangle(Brushes.White, ClientRectangle) 重填白底。
  • 顏色選取:整合自訂顏色拾取控制項。

專案下載

完整原始碼可至原文連結下載(VS2005 WinForm 專案)。

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