超详细c#窗体交互式画点,线,矩形,圆,椭圆,填充文字

超详细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的事件里找到MouseDownMouseMove写入相应方法。
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传入控件中。

完结撒花💟请添加图片描述

  • 28
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值