C#中添加自制控件

这篇具有很好参考价值的文章主要介绍了C#中添加自制控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先看最终成品为一个可以在XY坐标系下,进行点位显示的控件

c# 自定义控件,C#学习,c#,开发语言

制作过程:

1.添加用户控件类

c# 自定义控件,C#学习,c#,开发语言

2.进入代码编辑页面

套路式开发:继承 UserControl     public partial class PointCurve : UserControl

初始化过程:

        public PointCurve()
        {
            InitializeComponent();
            //设置控件样式
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //减少闪烁
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);  //启用双缓冲技术
            this.SetStyle(ControlStyles.ResizeRedraw, true); //根据窗口大小的重新绘制指令
            this.SetStyle(ControlStyles.Selectable, true);//激活与用户的交互响应
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//支持透明背景色
            this.SetStyle(ControlStyles.UserPaint, true);   //用户自己控制绘制

        }

画图类绘制对象的三大件:

       //画布
        private Graphics g;
        //画笔
        private Pen p;
        //画刷
        private SolidBrush sb;

控件属性:(显示在加载进入工具箱后的属性界面)

       
/****************原点****************************************/
        private int orginGap = 20;   //内部调用数值
        [Browsable(true)]            //在属性界面显示
        [Category("自定义属性")]     //分组类别
        [Description("原点坐标")]     //显示名称

        public int OriginGap        //外部用户交互变量
        {
            get { return orginGap; }
            set
            {
                if (value <= 0)
                {
                    return;
                }
                orginGap = value;
                this.Invalidate();   //外部改变后重新绘制
            
            }
        
        }
/****************X轴最大值****************************************/
        private float maxXAxis = 70000.0f;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("X轴最大值")]
        public float MaxXAxis
        {
            get { return maxXAxis; }
            set { maxXAxis = value;
                this.Invalidate();   //重新绘制
            }
            
        }

/****************Y轴最大值****************************************/

        private float maxYAxis = 70000.0f;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("Y轴最大坐标值")]
        public float MaxYAxis
        {
            get { return maxYAxis; }
            set { maxYAxis = value;
                this.Invalidate();   //重新绘制
            }
        }


/****************位置坐标1X轴坐标****************************************/

       [Browsable(true)]
        [Category("自定义属性")]
        [Description("位置坐标1X轴坐标")]
        public int ReclaimerXAxis
        {
            get { return reclaimerXAxis; }
            set
            {
                reclaimerXAxis = value;
                this.Invalidate();
            }
        }



/****************位置坐标1Y轴坐标****************************************/

       private int reclaimerYAxis = 0;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("位置坐标1Y轴坐标")]
        public int ReclaimerYAxis
        {
            get { return reclaimerYAxis; }
            set
            {
                reclaimerYAxis = value;
                this.Invalidate();
            }
        }

……想显示多少个坐标点可以自由添加




/****************颜色属性添加****************************************/

       private Color reclaimerColor = Color.Blue;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("坐标点颜色")]
        public Color ReclaimerColor
        {
            get { return reclaimerColor; }
            set
            {
                reclaimerColor = value;
                this.Invalidate();
            }
        }


/****************字符串属性添加****************************************/
        private string reclaimerStr = "位置1";

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("位置1字符串")]
        public string ReclaimerStr
        {
            get { return reclaimerStr; }
            set
            {
                reclaimerStr = value;
                this.Invalidate();
            }
        }
/****************绘制点直径属性添加****************************************/
        private int pointdiameter = 5;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("绘制点直径")]
        public int Pointdiameter
        {
            get { return pointdiameter; }
            set
            {
                pointdiameter = value;
                this.Invalidate();
            }
        }














以上信息都是属性信息,不涉及逻辑,属于为了实现自己绘制目的而定义的成员变量

接下来重写的OnPaint函数是真正的绘制过程,每次用户改变属性信息时,由于执行了  this.Invalidate();,都会后台去调用OnPaint函数,从而实现位置更新。

下面函数中涉及一些计算过程,其实是由于窗体绘图默认原点是左上角,而我们习惯的坐标系原点的左下角,里面的计算过程是为了将我们输入的位置坐标进行转换的过程,无需过分纠结,理解原理,this.Height.,this.with为实际的绘图画布大小

  protected override void OnPaint(PaintEventArgs e)  //执行重绘指令时会被调用
        {
            base.OnPaint(e);

            //绘制过程

            //绘制画布
            g = e.Graphics;
            //设置画布
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//消除锯齿
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

            //正式绘制

            //设置画笔

            p = new Pen(Color.Black, 1.5f);
            p.CustomEndCap = new AdjustableArrowCap(p.Width * 3, p.Width * 4, true);  //结束端采用箭头样式

            //绘制X轴
            g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(this.Width - orginGap, this.Height - orginGap));

            //绘制Y轴
            g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(orginGap, orginGap));

            //绘制原点
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;//字符中心居中
            sf.LineAlignment = StringAlignment.Center;//线中心居中
            g.DrawString("0", this.Font, new SolidBrush(Color.Black), new Rectangle(0, this.Height - orginGap, orginGap, orginGap), sf);
            //绘制X轴最大
            g.DrawString(maxXAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(this.Width -50, this.Height -orginGap+5, 50, orginGap), sf);
            //绘制Y轴最大
            g.DrawString(maxYAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(0, 0, 50, orginGap), sf);

            //绘制取料点

            float reclaimerX = (this.Width - 2 * orginGap) / maxXAxis * reclaimerXAxis + orginGap;
            float reclaimerY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * reclaimerYAxis + orginGap);
            g.FillEllipse(new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 0.5f * pointdiameter, reclaimerY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(reclaimerStr, this.Font, new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 25.0f, reclaimerY - 20.0f, 50.0f, 20.0f), sf);

            //绘制加工点

            float processX = (this.Width - 2 * orginGap) / maxXAxis * processXAxis + orginGap;

            float processY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * processYAxis + orginGap);

            g.FillEllipse(new SolidBrush(processColor), new RectangleF(processX - 0.5f * pointdiameter, processY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(processStr, this.Font, new SolidBrush(processColor), new RectangleF(processX - 25.0f, processY - 20.0f, 50.0f, 20.0f), sf);

            //绘制出料点

            float outletX = (this.Width - 2 * orginGap) / maxXAxis * outletXAxis + orginGap;

            float outletY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * outletYAxis + orginGap);

            g.FillEllipse(new SolidBrush(outletColor), new RectangleF(outletX - 0.5f * pointdiameter, outletY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(outletStr, this.Font, new SolidBrush(outletColor), new RectangleF(outletX - 25.0f, outletY - 20.0f, 50.0f, 20.0f), sf);


        }

下面附完整代码:文章来源地址https://www.toymoban.com/news/detail-761116.html

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;
using System.Drawing.Drawing2D;

namespace WindowsFormsApp1
{
    public partial class PointCurve : UserControl
    {
        public PointCurve()
        {
            InitializeComponent();
            //设置控件样式
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //减少闪烁
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);  //启用双缓冲技术
            this.SetStyle(ControlStyles.ResizeRedraw, true); //根据窗口大小的重新绘制指令
            this.SetStyle(ControlStyles.Selectable, true);//激活与用户的交互响应
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//支持透明背景色
            this.SetStyle(ControlStyles.UserPaint, true);   //用户自己控制绘制

        }

        #region   绘制对象的创建
        //画布
        private Graphics g;
        //画笔
        private Pen p;
        //画刷
        private SolidBrush sb;

        #endregion

        #region  控件属性
        private int orginGap = 20;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("原点坐标")]

        public int OriginGap
        {
            get { return orginGap; }
            set
            {
                if (value <= 0)
                {
                    return;
                }
                orginGap = value;
                this.Invalidate();   //重新绘制
            
            }
        
        }

        private float maxXAxis = 70000.0f;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("X轴最大值")]
        public float MaxXAxis
        {
            get { return maxXAxis; }
            set { maxXAxis = value;
                this.Invalidate();   //重新绘制
            }
            
        }

        private float maxYAxis = 70000.0f;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("Y轴最大坐标值")]
        public float MaxYAxis
        {
            get { return maxYAxis; }
            set { maxYAxis = value;
                this.Invalidate();   //重新绘制
            }
        }

        private int reclaimerXAxis = 0;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("取料口X轴坐标")]
        public int ReclaimerXAxis
        {
            get { return reclaimerXAxis; }
            set
            {
                reclaimerXAxis = value;
                this.Invalidate();
            }
        }

        private int reclaimerYAxis = 0;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("取料口Y轴坐标")]
        public int ReclaimerYAxis
        {
            get { return reclaimerYAxis; }
            set
            {
                reclaimerYAxis = value;
                this.Invalidate();
            }
        }

        private int processXAxis = 0;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("加工处X轴坐标")]
        public int ProcessXAxis
        {
            get { return processXAxis; }
            set
            {
                processXAxis = value;
                this.Invalidate();
            }
        }

        private int processYAxis = 0;
        [Browsable(true)]
        [Category("自定义属性")]
        [Description("加工处Y轴坐标")]
        public int ProcessYAxis
        {
            get { return processYAxis; }
            set
            {
                processYAxis = value;
                this.Invalidate();
            }
        }


        private int outletXAxis = 0;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("出料口X轴坐标")]
        public int OutletXAxis
        {
            get { return outletXAxis; }
            set
            {
                outletXAxis = value;
                this.Invalidate();
            }
        }


        private int outletYAxis = 0;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("出料口Y轴坐标")]
        public int OutletYAxis
        {
            get { return outletYAxis; }
            set
            {
                outletYAxis = value;
                this.Invalidate();
            }
        }

        private Color reclaimerColor = Color.Blue;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("取料口点颜色")]
        public Color ReclaimerColor
        {
            get { return reclaimerColor; }
            set
            {
                reclaimerColor = value;
                this.Invalidate();
            }
        }

        private Color processColor = Color.Green;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("加工处点颜色")]
        public Color ProcessColor
        {
            get { return processColor; }
            set
            {
                processColor = value;
                this.Invalidate();
            }
        }

        private Color outletColor = Color.Red;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("出料口点颜色")]
        public Color OutletColor
        {
            get { return outletColor; }
            set
            {
                outletColor = value;
                this.Invalidate();
            }
        }

        private string reclaimerStr = "取料口";

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("取料口字符串")]
        public string ReclaimerStr
        {
            get { return reclaimerStr; }
            set
            {
                reclaimerStr = value;
                this.Invalidate();
            }
        }

        private string processStr = "加工处";

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("加工处字符串")]
        public string ProcessStr
        {
            get { return processStr; }
            set
            {
                processStr = value;
                this.Invalidate();
            }
        }
        private string outletStr = "出料口";

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("出料口字符串")]
        public string OutletStr
        {
            get { return outletStr; }
            set
            {
                outletStr = value;
                this.Invalidate();
            }
        }

        private int pointdiameter = 5;

        [Browsable(true)]
        [Category("自定义属性")]
        [Description("绘制点直径")]
        public int Pointdiameter
        {
            get { return pointdiameter; }
            set
            {
                pointdiameter = value;
                this.Invalidate();
            }
        }

        #endregion
        protected override void OnPaint(PaintEventArgs e)  //执行重绘指令时会被调用
        {
            base.OnPaint(e);

            //绘制过程

            //绘制画布
            g = e.Graphics;
            //设置画布
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//消除锯齿
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

            //正式绘制

            //设置画笔

            p = new Pen(Color.Black, 1.5f);
            p.CustomEndCap = new AdjustableArrowCap(p.Width * 3, p.Width * 4, true);  //结束端采用箭头样式

            //绘制X轴
            g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(this.Width - orginGap, this.Height - orginGap));

            //绘制Y轴
            g.DrawLine(p, new Point(orginGap, this.Height - orginGap), new Point(orginGap, orginGap));

            //绘制原点
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;//字符中心居中
            sf.LineAlignment = StringAlignment.Center;//线中心居中
            g.DrawString("0", this.Font, new SolidBrush(Color.Black), new Rectangle(0, this.Height - orginGap, orginGap, orginGap), sf);
            //绘制X轴最大
            g.DrawString(maxXAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(this.Width -50, this.Height -orginGap+5, 50, orginGap), sf);
            //绘制Y轴最大
            g.DrawString(maxYAxis.ToString(), this.Font, new SolidBrush(Color.Black), new Rectangle(0, 0, 50, orginGap), sf);

            //绘制取料点

            float reclaimerX = (this.Width - 2 * orginGap) / maxXAxis * reclaimerXAxis + orginGap;
            float reclaimerY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * reclaimerYAxis + orginGap);
            g.FillEllipse(new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 0.5f * pointdiameter, reclaimerY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(reclaimerStr, this.Font, new SolidBrush(reclaimerColor), new RectangleF(reclaimerX - 25.0f, reclaimerY - 20.0f, 50.0f, 20.0f), sf);

            //绘制加工点

            float processX = (this.Width - 2 * orginGap) / maxXAxis * processXAxis + orginGap;

            float processY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * processYAxis + orginGap);

            g.FillEllipse(new SolidBrush(processColor), new RectangleF(processX - 0.5f * pointdiameter, processY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(processStr, this.Font, new SolidBrush(processColor), new RectangleF(processX - 25.0f, processY - 20.0f, 50.0f, 20.0f), sf);

            //绘制出料点

            float outletX = (this.Width - 2 * orginGap) / maxXAxis * outletXAxis + orginGap;

            float outletY = this.Height - ((this.Height - 2 * orginGap) / maxYAxis * outletYAxis + orginGap);

            g.FillEllipse(new SolidBrush(outletColor), new RectangleF(outletX - 0.5f * pointdiameter, outletY - 0.5f * pointdiameter, pointdiameter, pointdiameter));

            g.DrawString(outletStr, this.Font, new SolidBrush(outletColor), new RectangleF(outletX - 25.0f, outletY - 20.0f, 50.0f, 20.0f), sf);


        }

        private void PointCurve_Load(object sender, EventArgs e)
        {

        }
    }
}

到了这里,关于C#中添加自制控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#在winForm窗体中添加一个可以自由拖动的控件

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 目录 文章目录 一、实现步骤 1.创建一个新的Windows窗体项目 2.添加控件如图 3.代码部分 总结 textBox1=鼠标在需要拖动的控件中的坐标 X 值 textBox2=鼠标在需要拖动的控件中的坐标 Y 值 textBox3=需要

    2024年01月19日
    浏览(32)
  • C# 添加现有的窗体的时候,为何窗体的控件不显示了?

    有的项目中一些功能是可以复用的,将原始项目中的窗体文件添加到新项目时,发现有一些问题。添加完之后,打开的窗体发现没有显示任何控件,窗体的大小还变小了? 将Form1.cs Form1.resx Form1.Designer 三个文件直接复制到新项目的目录下,然后直接在新项目上选择添加现有项

    2024年02月10日
    浏览(33)
  • C# 通过自定义控件实现炫酷的时间显示

    先看效果 话不多说,直接上代码 基础的自定义控件 LED_Num

    2024年02月09日
    浏览(40)
  • C# Window form 自定义控件的结构和设计(三)

    C# Window form 自定义控件的结构和设计 (三) 一、前面介绍了如何来创建第一个自定义的控件,以及一个测试程序。下面我们来看下如何在自定义控件中添加属性。 C#和其他.NET语言支持属性作为语言的第一类成员。把属性作为语言的基础属性有两点主要的有点: ①利用属性使放

    2024年04月15日
    浏览(33)
  • C# 控件基础2——属性配置控件PropertyGrid使用详解,PropertyGrid自定义下拉框TypeConverter,PropertyGrid自定义弹窗UITypeEditor,特性

    最近比较忙,一段时间没写博文了。最近仿vs做了一个自定义界面的功能,使用到了PropertyGrid控件,让我的代码量减少了很多,就抽个晚上把PropertyGrid控件的使用技巧分享一下。 PropertyGrid控件估计大家都很熟悉,但凡使用winform开发过界面的都认识,就是配置控件属性的控件,

    2024年02月09日
    浏览(32)
  • C#——表格开发之DataGridView控件

    目录 一、概要 二、手动填充数据 1、如何手动填充数据 2、如何插入一行数据 3、如何修改单元格值 三、DataGridView控件绑定数据源 1、概述 2、将DataGridView绑定到BindingSource 使用DataGridView控件,您可以显示和编辑来自许多不同类型数据源的表格数据。 DataGridView控件为显示数据提

    2024年02月03日
    浏览(31)
  • Visual Studio C# WinForm开发入门(3):各种控件介绍

    窗口就是打开程序我们所面对的一个面板,里面可以添加各种控件,如下图所示,我们可以在属性栏设置其标题名称、图标、大小等。 双击标题框,会生成Load函数,也可以到事件里面去找 Load函数是窗口生成后需要执行的事件函数。 可以在里面加一些初始化函数。 (1)Na

    2024年02月09日
    浏览(40)
  • Visual Studio C# WinForm开发入门(6):TreeView 控件使用

    TreeView控件用树显示节点层次。 例如:顶级目录是根(C:),C盘下的每个子目录都是子节点,而每个子目录又都有自己的子节点 TreeView属性和方法: 属性 说明 CheckBoxes 表示节点旁边是否出现复选框 ImageList 指定一个包含节点图标的ImageList对象。ImageList对象是一个包含Image对象的

    2024年02月02日
    浏览(36)
  • Visual Studio C# WinForm开发入门(5):TabControl 控件使用

    TabContrl选项卡控件可创建标签化窗口,在实际 编程中经常用到,该控件的作用是将相关的组件组合到一系列选项卡页面上。 比如下面的例子,在tabPage1页面和tabPage2页面各放了2个checkBox控件,通过点击不同page即可切换: 1、添加和删除TabControl控件中的选项卡 有两种方法: 第

    2024年02月07日
    浏览(36)
  • 【C#学习记录】如何让界面控件实现自适应布局(Winform)

    小伙伴们大家好,我是雷工! 在软件界面设计中,客户常常要求设计的界面可以随意缩放,缩放过程中,界面中的按钮等控件也会随着窗体变大缩小自动调整显示位置和尺寸大小。在C#的Winform窗体中如何实现这个效果,下面我们一起学习下。 本样例的程序运行环境具体如下

    2023年04月21日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包