超详细c#窗体交互式画点,线,矩形,圆,椭圆,填充文字
首先,直接上图📢
小白可轻松完成版🎯
实现算法🔎
1.第一步就是创建一个类库应用程序,创建用户控件类,进行界面设计,实现绘制点、线、多边形、圆、椭圆、文字等功能。
🍳下面是详细步骤:
(1)在C#编程环境中,创建类库应用程序。
(2)设计控件界面,实现绘制点、线、多边形、圆、椭圆、文字等功能。
首先,找到工具箱,在工具箱下找到ToolTip拖到页面中来。然后再找到button控件,让button到ToolTip中来🚥
这里的button是图片填充(点击button找到属性,在属性下设置填充方式),图片素材网址自觉放在下面:
阿里巴巴矢量图标库
https://www.iconfont.cn/collections/detail?spm=a313x.7781069.1998910419.d9df05512&cid=44936
然后在button的事件里找到MouseDown和MouseMove写入相应方法。
DrawingControl.cs完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DrawingControl
{
public partial class DrawingControl: UserControl
{
private Pen pen1;
private SolidBrush bs;
private PictureBox pic = new PictureBox();
// private Point startPoint;
private int drawmodel = 0;
int clicknum = 0;
int x1;
int y1;
int x2;
int y2;
Graphics g;
public DrawingControl()
{
InitializeComponent();
}
public DrawingControl(ref PictureBox pic1)
{
InitializeComponent();
pic = (PictureBox)pic1;
pic.BackColor = Color.White;
pic.Cursor = Cursors.Arrow;
g = pic.CreateGraphics();//创建画板
clicknum = 0;
drawnode = 0;
}
private void DrawingControl_Load(object sender, EventArgs e)
{
pic.Cursor = Cursors.Arrow;
pic.MouseDown += new MouseEventHandler(this.pic_MouseDown1);//定约事件
pic.MouseUp += new MouseEventHandler(this.pic_MouseUp);
pic.DoubleClick += new EventHandler(this.pic_DoubleClick);
}
private void button1_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.Cross;
pen1 = new Pen(Color.Blue, 3);
drawmodel = 1;//设置画图类型为画线
}
public Pen mypen
{
get
{
return pen1;
}
}
public SolidBrush mybs
{
get
{
return bs;
}
}
public int drawnode
{
get
{
return drawmodel;
}
set
{
drawmodel = value;
}
}
private void pic_MouseDown1(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (pic.Cursor == Cursors.Cross && drawnode==1)
{//若画线
if (clicknum > 0)
{//若不为第一个点
pen1 = mypen;
x2 = e.X;
y2 = e.Y;
g.DrawLine(pen1, x1, y1, x2, y2);//画线
x1 = x2;
y1 = y2;
}
else
{
x1 = e.X;
y1 = e.Y;
}
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 2)
{
x1 = e.X;
y1 = e.Y;
pen1 = mypen;
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 3)
{
x1 = e.X;
y1 = e.Y;
pen1 = mypen;
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 4)
{
x1 = e.X;
y1 = e.Y;
pen1 = mypen;
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 5)
{
x1 = e.X;
y1 = e.Y;
pen1 = mypen;
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 6)
{
x1 = e.X;
y1 = e.Y;
pen1 = mypen;
}
clicknum = clicknum + 1;
}
private void pic_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (pic.Cursor == Cursors.UpArrow && drawnode == 2) //若画矩形框
{
x2 = e.X;
y2 = e.Y;
int w;
int h;
w = Math.Abs(x2 - x1);
h = Math.Abs(y2 - y1);
g.DrawRectangle(pen1, new Rectangle(x1, y1, w, h));
x1 = x2;
y1 = y2;
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 3)
{
x2 = e.X;
y2 = e.Y;
int a = Math.Abs(x2 - x1);
int b = Math.Abs(y2 - y1);
int r = (int)Math.Sqrt(a * a + b * b);
g.DrawEllipse(pen1, new Rectangle(x1 - a, y1 - b, 2 * r, 2 * r));
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 4)
{
x1 = e.X;
y1 = e.Y;
//g.DrawLine(pen1, x1, y1, e.X, e.Y);
Font font = new Font("宋体", 16, FontStyle.Bold);
g.DrawString("软件与开发", font, bs, x1, y1);
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 5)
{
x1 = e.X;
y1 = e.Y;
g.DrawEllipse(pen1, e.X, e.Y, 4, 4);
}
else if (pic.Cursor == Cursors.UpArrow && drawnode == 6)
{
x2 = e.X;
y2 = e.Y;
int a = Math.Abs(x2 - x1);
int b = Math.Abs(y2 - y1);
int r = (int)Math.Sqrt(a * a +b * b);
int m = (int)Math.Sqrt(a * a - b * b);
g.DrawEllipse(pen1, new Rectangle(x1 - a/2, y1 - b/2, 2 * r, 2 * m));
}
}
private void pic_DoubleClick(object sender, System.EventArgs e)
{
pic.Cursor = Cursors.Arrow;
drawnode = 0;
clicknum = 0;
x1 = 0;
y1 = 0;
x2 = 0;
y2 = 0;
}
private void button2_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.UpArrow;
pen1 = new Pen(Color.Green, 8);//创建画笔
drawmodel = 2;//设置画图类型为画矩形框
}
private void button1_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button1, "画线");
}
private void button2_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button2, "画矩形框");
}
private void button3_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.UpArrow;
pen1 = new Pen(Color.Red, 5);
drawmodel = 3;//设置画图类型为画圆
}
private void button3_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button3, "画圆");
}
private void button4_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button4, "填充文字");
}
private void button4_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.UpArrow;
//pen1 = new Pen(Color.Cyan, 5);
bs = new SolidBrush(ForeColor);
drawmodel = 4;//设置画图类型为文字
}
private void button5_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button5, "画点");
}
private void button5_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.UpArrow;
pen1 = new Pen(Color.Red, 4);
drawmodel = 5;//设置画图类型为画点
}
private void button6_MouseMove(object sender, MouseEventArgs e)
{
toolTip1.SetToolTip(button6, "画椭圆");
}
private void button6_MouseDown(object sender, MouseEventArgs e)
{
pic.Cursor = Cursors.UpArrow;
pen1 = new Pen(Color.Blue, 5);
drawmodel = 6;//设置画图类型为画椭圆
}
}
}
🎨最后,就是在项目里再创建一个窗体
(鼠标右击解决方案,点击【添加】----》【添加新项目】----》【c#窗体应用】)
这时候我们的项目里就多了一个Form🧵同样的,我们在工具箱里找到pictureBox将它拖到窗体中,调整一下下大小。
Form1.cs 完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Drawing
{
public partial class Form1 : Form
{
private DrawingControl.DrawingControl drawingControl;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.drawingControl = new DrawingControl.DrawingControl(ref pictureBox1);
this.drawingControl.drawnode = 0;
this.drawingControl.Location = new System.Drawing.Point(10, 0);
this.drawingControl.Name = "Control11";
this.drawingControl.Size = new System.Drawing.Size(280, 100);
this.drawingControl.TabIndex = 2;
this.Controls.Add(this.drawingControl);
}
}
}
🎠到此就完成了!
最后,让我们了解一下本次项目有关的知识点吧😆
(1)知识要点:
1.组件与控件的关系。
1)组件:首先最广的应该是组件。凡是在软件开发中用到了软件的复用,被复用的部分都可以称为组件。
2)控件:控件也是组件中的一种。控件就是具有用户界面的组件(可视化组件),比如:按钮、列表框、编辑框或者某个对话框中的静态文本等。
控件就是组件。控件通常是指设计时所见即所得、运行时处理图形显示和接受用户交互输入的那些组件。当你开发一个组件,你需要从具有丰富的界面和交互机制的父类去继承,那么你做出来的当然就是控件了。
2.创建组件与控件应用程序的主要过程。
1.)创建一个类,并从适当的基类继承。例如,如果要创建一个自定义按钮控件,可以从Button类继承。
2)在类中添加属性、方法和事件,以实现自定义控件的功能。
3)在类中添加构造函数,以初始化控件的属性和事件处理程序。
4)在类中添加必要的重写,以处理控件的外观和行为。
5)将组件或控件打包为DLL文件,以便在其他应用程序中使用。
在C#中创建组件的一般过程如下:
1.在Visual Studio中创建一个新的“类库”项目,命名空间(namespace)要与组件的名称相同。
2…在该项目中添加需要提供给其他应用程序使用的类和方法。
3.使用“属性”窗口设置公共接口
4.使用“生成”菜单下的“生成解决方案”来生成DLL文件。
5.在其他项目中添加引用(Reference)到该DLL文件。
6.使用该组件中公共接口提供的类和方法。
在C#中,创建控件的一般过程包括以下几个步骤:
1.打开Visual Studio,创建一个新的Windows Form应用程序项目。
2…在设计模式下,从工具箱中拖拽需要的控件到窗体上。
3.右键单击控件,选择属性窗口,在属性窗口中设置控件的属性,如大小、位置、字体、文本等。
4.在代码模式下,编写控件的事件处理程序,以响应控件的事件,如单击按钮、选择下拉框等。
5.编译和运行应用程序,测试控件。
(2)注意的问题:
创建绘图控件时将窗体上的PixtureBox传入控件中。
完结撒花💟