WINFORM画笔实现画板(如何实现橡皮擦和清空画板功能)

news/2024/9/25 15:25:00/

C#内部并没有提供橡皮擦功能所以,只能使用画笔和颜色填充来实现橡皮擦和清空画板功能。

此次小编写了一个简易的画板功能其中包含橡皮擦,清空面板,在窗体运行中修改画笔颜色和像素等功能。

代码如下:

using Sunny.UI;
using Sunny.UI.Win32;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.LinkLabel;namespace 画板完整版
{public partial class Form1 : UIForm{// 定义绘制对象Graphics g;Bitmap bmp;// 起点坐标Point start; bool flag = false;// 画笔颜色Color c1 = Color.Black;//画笔粗细int size = 1;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){pictureBox1.Image = Image.FromFile("./1.png");bmp = (Bitmap)pictureBox1.Image.Clone();g = Graphics.FromImage(bmp);// 默认主题this.uiComboBox1.SelectedIndex = 0;this.uiStyleManager1.Style = (UIStyle)Enum.Parse(typeof(UIStyle), this.uiComboBox1.SelectedItem.ToString());// 默认画笔像素this.uiComboBox2.SelectedIndex = 0;// 设置XY轴默认像素this.uiLabel1.Text = "像素: { X:" + "0" + ",Y:" + "0 }";// 时间timer1.Interval = 1000;timer1.Enabled = true;this.time.Text = "北京时间: " + (DateTime.Now).Year + "年" + (DateTime.Now).Month + "月" + (DateTime.Now).Day + "日" + (DateTime.Now).Hour + "时" + (DateTime.Now).Minute + "分" + (DateTime.Now).Second + "秒";}// 时间private void timer1_Tick(object sender, EventArgs e){this.time.Text = "北京时间: " + (DateTime.Now).Year + "年" + (DateTime.Now).Month + "月" + (DateTime.Now).Day + "日" + (DateTime.Now).Hour + "时" + (DateTime.Now).Minute + "分" + (DateTime.Now).Second + "秒";}// 修改主题private void uiComboBox1_SelectedIndexChanged(object sender, EventArgs e){this.uiStyleManager1.Style = (UIStyle)Enum.Parse(typeof(UIStyle), this.uiComboBox1.SelectedItem.ToString());}// 清空画板private void uiSymbolButton2_Click(object sender, EventArgs e){Point[] p ={new Point(-2,-2),new Point(810,-2),new Point(810,515),new Point(-2,515),new Point(-2,-2)};g.FillPolygon(Brushes.White, p);pictureBox1.Image = bmp;}// 设置画笔private void uiSymbolButton3_Click(object sender, EventArgs e){if(s==0&&co==null)return;size = s; c1 = co;this.uiComboBox2.Text = size.ToString();}// 画笔颜色private void uiButton1_Click(object sender, EventArgs e){DialogResult r = colorDialog1.ShowDialog();if (r == DialogResult.OK){c1 = colorDialog1.Color;}}// 画笔粗细private void uiComboBox2_SelectedIndexChanged(object sender, EventArgs e){size = int.Parse(uiComboBox2.SelectedItem.ToString());}// 鼠标按下的方法,主要是获取按下时候的坐标也就是起点坐标private void pictureBox1_MouseDown(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left)// 点击了鼠标左键{start = e.Location; // 当前点击的坐标flag = true;}}// 鼠标移动的时候获取点,获取会追的结束点,并且划线private void pictureBox1_MouseMove(object sender, MouseEventArgs e){this.uiLabel1.Text = "像素: {X:" + e.X + ",Y:" +e.Y+"}";if (flag == false) return;g.DrawLine(new Pen(c1, size), start, e.Location);start = e.Location;// 重置起始点pictureBox1.Image = bmp;}// 结束绘制private void pictureBox1_MouseUp(object sender, MouseEventArgs e){flag = false;pictureBox1.Image = bmp;}// 橡皮int s = 0;Color co;private void uiSymbolButton1_Click(object sender, EventArgs e){s = size; co = c1;size = 20;c1 = Color.White;this.uiComboBox2.Text = size.ToString();}// 保存private void uiSymbolButton4_Click(object sender, EventArgs e){if(bmp == null) return;SaveFileDialog sf = new SaveFileDialog(); // 保存对话框sf.Filter = "图像文件|*.png|jpg图片|*.jpg";if (sf.ShowDialog() == DialogResult.OK){bmp.Save(sf.FileName, ImageFormat.Png); //MessageBox.Show("保存至" + sf.FileName, "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}}
}


http://www.ppmy.cn/news/1428722.html

相关文章

多种方法完美解决 java.lang.IllegalStateException: Duplicate key 2

文章目录 1. 复现错误2. 分析错误3. 解决问题3.1 方法13.2 方法21. 复现错误 在实际工作中,经常遇到java.lang.IllegalStateException: Duplicate key xxx这样的错误,如下示例代码: @Setter @Getter @Accessors(chain = true) public class

富格林:看破虚假交易警惕受害亏空

富格林悉知,黄金投资不仅具有强大的保值功能,其剧烈的市场变化也隐含着巨大的盈利潜力,吸引着众多投资者入市。但投资有风险,黄金投资也是如此,在做投资的之前要注意了解其风险,在做单过程中做好风险控制警…

Arcgis 定义投影、投影变换、导出栅格为tif

目录 一、Arcgis 定义投影 1、定义投影 2、设置平移 二、投影变换 1、栅格数据的投影变换 2、矢量数据的投影变换

IO-序列化流

简介 这个流是为了传输对象而生的对象序列化:把java对象写入到文件中对象反序列化:把文件中的对象读出来 继承体系 ObjectInputStream:把文件中的对象读出来ObjectOutputStream:把java对象写入到文件中 常用API 示例 实体类必须实现序列化接口这其实就是…

设计模式代码实战-中间者模式

1、问题描述 小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。 输入示例 3 User1 User2 User3 User1 Hello_All! User2 Hi_User1! User3 How_is_everyone? 输出…

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序) 输入 第一行,数的个数n; 第二行,n个非负整数。 输出 由大到小的n个非负整数,每个数占一行。 样例输入 …

Java学习Go(入门)

下载Go 《官网下载golang》 直接点Download,然后根据你自己的操作系统进行下载,我这里以win10为例 安装go 默认安装到C:\Program Files\Go,这里我们可以选择安装到其他盘,也可以选择默认安装。初学者建议直接一路next。 安装完…

【Linux】centos 7 vim默认一个tab键相当于8个空格 -> 修改成4个空格

专栏文章索引:Linux 有问题可私聊:QQ:3375119339 目录 一、项目场景 二、问题描述 三、原因分析 四、解决方案 1.仅本次 2.永久 一、项目场景 使用vim编辑器编写python3代码 二、问题描述 在使用vim编辑器时,想要缩进&am…