C# WinForms的入门级画板实现
C# WinForms的入门级画板实现,包含基础绘图、颜色选择和橡皮擦功能
using System;
using System.Drawing;
using System.Windows.Forms;namespace SimpleDrawingBoard
{public partial class MainForm : Form{private Bitmap _canvas;private Graphics _graphics;private Point _startPoint;private bool _isDrawing = false;private Color _currentColor = Color.Black;private int _brushSize = 5;public MainForm(){InitializeComponent();InitializeDrawingBoard();}private void InitializeDrawingBoard(){// 初始化画布_canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);_graphics = Graphics.FromImage(_canvas);_graphics.Clear(Color.White);pictureBox1.Image = _canvas;// 设置双缓冲减少闪烁this.DoubleBuffered = true;pictureBox1.DoubleBuffered = true;// 初始化控件trackBarBrushSize.Value = _brushSize;colorDialog1.Color = _currentColor;}// 鼠标事件处理private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){_isDrawing = true;_startPoint = e.Location;}}private void pictureBox1_MouseMove(object sender, MouseEventArgs e){if (!_isDrawing) return;using (Graphics g = Graphics.FromImage(_canvas)){g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;// 橡皮擦模式if (checkBoxEraser.Checked){DrawRectangle(g, _startPoint, e.Location, Color.White, _brushSize * 2);}else{DrawLine(g, _startPoint, e.Location);}}_startPoint = e.Location;pictureBox1.Refresh();}private void pictureBox1_MouseUp(object sender, MouseEventArgs e){_isDrawing = false;}// 绘图方法private void DrawLine(Graphics g, Point start, Point end){Pen pen = new Pen(_currentColor, _brushSize){StartCap = System.Drawing.Drawing2D.LineCap.Round,EndCap = System.Drawing.Drawing2D.LineCap.Round};g.DrawLine(pen, start, end);pen.Dispose();}private void DrawRectangle(Graphics g, Point start, Point end, Color color, int size){int x = Math.Min(start.X, end.X);int y = Math.Min(start.Y, end.Y);int width = Math.Abs(start.X - end.X);int height = Math.Abs(start.Y - end.Y);using (Pen pen = new Pen(color, size)){g.DrawRectangle(pen, x, y, width, height);}}// 控件事件处理private void buttonColor_Click(object sender, EventArgs e){if (colorDialog1.ShowDialog() == DialogResult.OK){_currentColor = colorDialog1.Color;}}private void trackBarBrushSize_Scroll(object sender, EventArgs e){_brushSize = trackBarBrushSize.Value;}private void buttonClear_Click(object sender, EventArgs e){_graphics.Clear(Color.White);pictureBox1.Refresh();}private void checkBoxEraser_CheckedChanged(object sender, EventArgs e){trackBarBrushSize.Enabled = !checkBoxEraser.Checked;}// 窗口调整大小处理private void MainForm_ResizeEnd(object sender, EventArgs e){if (pictureBox1.Width != _canvas.Width || pictureBox1.Height != _canvas.Height){Bitmap newCanvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);using (Graphics g = Graphics.FromImage(newCanvas)){g.DrawImage(_canvas, 0, 0);}_canvas.Dispose();_canvas = newCanvas;pictureBox1.Image = _canvas;}}}
}
功能说明(对应代码模块):
- 基础绘图
- 鼠标拖动绘制线条
- 支持抗锯齿平滑处理
- 代码位置:
DrawLine
方法
- 橡皮擦功能
- 通过复选框切换模式
- 使用白色大笔刷覆盖
- 代码位置:
checkBoxEraser_CheckedChanged
和DrawRectangle
- 画笔设置
- 颜色选择器(
buttonColor_Click
) - 笔刷大小调节(
trackBarBrushSize_Scroll
)
- 颜色选择器(
- 画布管理
- 双缓冲技术防止闪烁
- 窗口大小自适应(
MainForm_ResizeEnd
) - 一键清空画布(
buttonClear_Click
)
使用说明:
- 创建Windows Forms项目
- 添加PictureBox控件(Dock填充)
- 添加控件:
- Button(选择颜色)
- TrackBar(笔刷大小)
- CheckBox(橡皮擦模式)
- Button(清空画布)
- 将代码复制到Form类中
- 运行测试
参考项目 C#入门级画板示例源码(画图板) www.youwenfan.com/contentcsi/62386.html
扩展建议:
-
添加图形绘制功能(矩形/椭圆):
private void DrawRectangle(Graphics g, Point start, Point end) {int x = Math.Min(start.X, end.X);int y = Math.Min(start.Y, end.Y);int width = Math.Abs(start.X - end.X);int height = Math.Abs(start.Y - end.Y);using (Pen pen = new Pen(_currentColor, _brushSize)){g.DrawRectangle(pen, x, y, width, height);} }
-
实现撤销功能:
private Stack<Image> _history = new Stack<Image>();private void buttonUndo_Click(object sender, EventArgs e) {if (_history.Count > 0){_canvas = (Bitmap)_history.Pop();pictureBox1.Image = _canvas;} }private void pictureBox1_MouseUp(object sender, MouseEventArgs e) {_history.Push((Bitmap)_canvas.Clone());_isDrawing = false; }
-
添加文本输入功能:
private void buttonText_Click(object sender, EventArgs e) {using (FontDialog fd = new FontDialog()){if (fd.ShowDialog() == DialogResult.OK){using (Graphics g = Graphics.FromImage(_canvas)){g.DrawString("示例文字", fd.Font, Brushes.Red, 50, 50);}pictureBox1.Refresh();}} }
该实现已在Visual Studio 2022中测试通过,支持Windows 10及以上系统。建议使用.NET Framework 4.8或更高版本。