C-WinForms的入门级画板实现
目录
C# WinForms的入门级画板实现
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#入门级画板示例源码(画图板)
扩展建议:
添加图形绘制功能(矩形/椭圆):
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或更高版本。