详细介绍:C# WinForms的入门级画板实现

news/2025/10/12 9:13:18/文章来源:https://www.cnblogs.com/tlnshuju/p/19136267

详细介绍:C# WinForms的入门级画板实现

2025-10-12 09:08  tlnshuju  阅读(0)  评论(0)    收藏  举报

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;
}
}
}
}

功能说明(对应代码模块):

  1. 基础绘图
    • 鼠标拖动绘制线条
    • 支持抗锯齿平滑处理
    • 代码位置:DrawLine方法
  2. 橡皮擦功能
    • 通过复选框切换模式
    • 使用白色大笔刷覆盖
    • 代码位置:checkBoxEraser_CheckedChangedDrawRectangle
  3. 画笔设置
    • 颜色选择器(buttonColor_Click
    • 笔刷大小调节(trackBarBrushSize_Scroll
  4. 画布管理
    • 双缓冲技术防止闪烁
    • 窗口大小自适应(MainForm_ResizeEnd
    • 一键清空画布(buttonClear_Click

使用说明:

  1. 创建Windows Forms项目
  2. 添加PictureBox控件(Dock填充)
  3. 添加控件:
    • Button(选择颜色)
    • TrackBar(笔刷大小)
    • CheckBox(橡皮擦模式)
    • Button(清空画布)
  4. 将代码复制到Form类中
  5. 运行测试

参考项目 C#入门级画板示例源码(画图板) www.youwenfan.com/contentcsi/62386.html

扩展建议:

  1. 添加图形绘制功能(矩形/椭圆):

    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);
    }
    }
  2. 实现撤销功能:

    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;}
  3. 添加文本输入功能:

    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或更高版本。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【springboot的分页功能TableDataInfo,有时候需要艰难的分页实现,怎么办呢?】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

生成式AI实现多模态信息检索技术突破

本文介绍了一种基于生成式AI的多模态信息检索框架GENIUS,通过语义量化和查询增强技术,直接生成数据ID代码而非传统向量比对,显著提升了检索效率。该方法在多项测试中性能提升22%-56%,解决了大规模数据集下的检索效…

在运维工作中,如何过滤某个目录在那边什么路径下面?

在 Linux 中,如果你想要查找某个特定目录位于哪个路径下(即查找目录的位置),可以使用以下几种常用的命令来“过滤”或搜索该目录。以下是几种最实用的方法:✅ 1. 使用 find 命令(最常用、最强大) find /path/to…

完整教程:安卓中,kotlin如何写app界面?

完整教程:安卓中,kotlin如何写app界面?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

移动固态硬盘插入电脑后提示“应该格式化”或“文件系统损坏”如何修复?

移动固态硬盘插入电脑后提示“应该格式化”或“文件系统损坏”如何修复?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

PHP 15 个高效开发的小技巧

PHP 15 个高效开发的小技巧 在 PHP 开发中,你不需要依赖新框架也能显著提升效率。真正有用的是那些能节省时间、减少重复工作的小技巧。本文将介绍一些简单但强大的 PHP 技巧,帮助你编写更简洁、更健壮的代码。 原文…

AI元人文构想研究:人类拥抱AI的文明新范式

AI元人文构想研究:人类拥抱AI的文明新范式 摘要:本文提出"AI元人文"理论构想,旨在回应人工智能时代技术与人文价值深度融合的文明需求。该构想基于"价值能量系统"理论模型,通过"悟空之眼…

华为发布星河AI广域网解决方案,四大核心能力支撑确定性网络 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【汇编】汇编语言运行过程

【汇编】汇编语言运行过程 汇编的运行分为以下三个步骤:编辑源程序 汇编源程序及连接源程序 运行.exe文件1. 编辑源程序 利用编辑器编辑源程序,文件扩展名为.ASM。 2. 汇编源程序 汇编语言源程序可使用下列简化命令进…

设计模式与原则精要 - 详解

设计模式与原则精要 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

电感式传感器 - 实践

电感式传感器 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

云栖2025 | 阿里云自研大素材平台 ODPS 重磅升级:全面支持AI计算和服务

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-J/S2024第二轮提高级题目知识构成分析报告

CSP-J/S2024第二轮提高级题目知识构成分析报告CCF ​已认证机构号本报告基于《全国青少年信息学奥林匹克系列竞赛大纲(2023 年修订版)》,对CSP-S2024四道题目展开分析,涵盖知识点、难度系数及选手能力要求,最后对…

浅层 CNN 的瓶颈:用 LeNet 实测不同数据集

本实验旨在评估 LeNet 卷积神经网络 在不同复杂度数据集上的表现,以验证其泛化能力与局限性。我们选择了三个典型数据集: • MNIST:2828 灰度手写数字,任务简单、类内差异小; • Fashion-MNIST:2828 灰度服饰图像…

文本派 - 停服公告 2025

文本派 - 极简在线文本存储 停服通知根据相关部门和监管要求,需要对存储在云端的数据进行合法性审查。由于“文本派”采用前端加密模式,我们无法解密用户数据以排查潜在滥用情况。经内部充分讨论并遵循监管要求,我们…

lCode题库

https://c.icode.org.cn/wrc_learn

Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统

Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统Arista cEOS 4.35.0F 发布 - 针对云原生环境设计的容器化网络操作系统 Containerized EOS 数据中心网络操作系统 请访问原文链接:https://sysin.o…

Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统

Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统Arista vEOS 4.35.0F 发布 - 虚拟化的数据中心和云网络可扩展操作系统 Virtual EOS 数据中心网络操作系统 请访问原文链接:https://sysin.org/blo…

因果机器学习的技术发展与挑战

本文深入探讨因果机器学习这一新兴领域,涵盖因果发现、可解释AI、公平性算法等关键技术议题,分析图形模型与统计方法在因果推断中的应用,并展望该领域的未来发展方向与数学工具演进。ICML:因果遇见机器学习之地 某…

深入解析:Spring依赖注入方式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …