ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#--自定义控件-开发LED指示灯控件

2021-01-10 21:34:15  阅读:144  来源: 互联网

标签:控件 LED 自定义 Color private new true public


以下是学习笔记:

参考:https://www.bilibili.com/video/BV1eQ4y1M7ZY?p=5

效果如下:

 

 

思考:实现以上效果要用到哪些属性

颜色,是否有边框,外环宽度,是否高亮,中心颜色,是否闪烁,颜色列表,闪烁的频率

如果是开关,就需要bool类型 True,False颜色

如果是多种状态,当前值数值类型

常规操作:

 一,自定义LED显示的控件

1,添加“用户控件”,命名MyLED

 

 

2,编写用户控件的MyLED的代码

    public partial class MyLED : UserControl
    {
        public MyLED()
        {
            
            InitializeComponent();

            #region 【1】设置双缓冲等属性

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.UserPaint, true);

            #endregion

        }

        #region 【2】定义三个字段

        private Graphics g;
        private Pen p;
        private SolidBrush sb;

        #endregion

        #region 【3】添加一个设置Graphics的方法
        
        private void SetGraphics(Graphics g)
        {
            //设置画布的属性
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        }

        #endregion

        #region 【4】根据实际控件分析的结果,创建属性

        private Color ledColor = Color.Green;

        [Category("jason控件属性")]
        [Description("LED指示灯演示")]
        public Color LedColor
        {
            get { return ledColor; }
            set
            {
                ledColor = value;
                this.Invalidate();
            }
        }

        #endregion

        #region 【5】创建重绘的事件

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            g = e.Graphics;//获取画布
            SetGraphics(g);//设置画布

            //情况1:如果宽度大于高度(以高度为准)
            if (this.Width > this.Height)
            {
                sb = new SolidBrush(ledColor);
                Rectangle rec=new Rectangle(1,1,this.Height-2,this.Height-2);//创建矩形
                g.FillEllipse(sb,rec);//画圆
            }
        }

        #endregion
    }

  

3,重新生成后在工具箱里面就可以看到MyLED的控件了,拖入后可以直接使用

 

 

 

 注意:如果只有这个代码,那只有宽度大于高度的时候才会画圆。

 

根据指示灯的功能需求,最终代码如下

    public partial class MyLED : UserControl
    {
        public MyLED()
        {
            
            InitializeComponent();

            #region 【1】设置双缓冲等属性

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.UserPaint, true);

            #endregion

        }

        #region 【2】定义三个字段

        private Graphics g;
        private Pen p;
        private SolidBrush sb;

        #endregion

        #region 【3】添加一个设置Graphics的方法
        
        private void SetGraphics(Graphics g)
        {
            //设置画布的属性
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        }

        #endregion

        #region 【4】根据实际控件分析的结果,创建属性

        private Color ledColor = Color.Green;

        [Category("jason控件属性")]
        [Description("LED指示灯演示")]
        public Color LedColor
        {
            get { return ledColor; }
            set
            {
                ledColor = value;
                this.Invalidate();
            }
        }

        private bool isBorder = true;

        [Category("jason控件属性")]
        [Description("是否有边框")]
        public bool IsBorder
        {
            get { return isBorder; }
            set
            {
                isBorder = value;
                this.Invalidate();
            }
        }

        private int borderWidth = 5;

        [Category("jason控件属性")]
        [Description("圆环的宽度")]
        public int BorderWidth
        {
            get { return borderWidth; }
            set
            {
                borderWidth = value;
                this.Invalidate();
            }
        }

        private int gapWidth = 5;

        [Category("jason控件属性")]
        [Description("间隙的宽度")]
        public int GapWidth
        {
            get { return gapWidth; }
            set
            {
                gapWidth = value;
                this.Invalidate();
            }
        }

        private bool isHighLight = true;

        [Category("jason控件属性")]
        [Description("是否高亮")]
        public bool IsHighLight
        {
            get { return isHighLight; }
            set
            {
                isHighLight = value;
                this.Invalidate();
            }
        }

        private Color centerColor = Color.White;

        [Category("jason控件属性")]
        [Description("渐变中心的颜色")]
        public Color CenterColor
        {
            get { return centerColor; }
            set
            {
                centerColor = value;
                this.Invalidate();
            }
        }

        #endregion

        #region 【5】创建重绘的事件

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            g = e.Graphics;//获取画布
            SetGraphics(g);//设置画布

            #region 1,画一个圆

            //if (this.Width > this.Height)//情况1:如果宽度大于高度(以高度为准)
            //{
            //    sb = new SolidBrush(ledColor);
            //    Rectangle rec=new Rectangle(1,1,this.Height-2,this.Height-2);//创建矩形
            //    g.FillEllipse(sb,rec);//画圆
            //}
            //else//情况2:如果高度大于宽度(以宽度为准)
            //{
            //    sb = new SolidBrush(ledColor);
            //    Rectangle rec = new Rectangle(1, 1, this.Width - 2, this.Width - 2);//创建矩形
            //    g.FillEllipse(sb, rec);//画圆
            //}

            //优化上面的代码
            int LEDWidth = Math.Min(this.Width, this.Height);
            sb = new SolidBrush(ledColor);
            RectangleF rec = new RectangleF(1, 1, LEDWidth - 2, LEDWidth - 2);//创建矩形
            g.FillEllipse(sb, rec);//画圆

            #endregion

            #region 2,在圆里面画一个圆环

            //如果有边框,那就画一个圆环
            if (isBorder)//参数这里用字段或属性都可以,如果用属性,程序要都走一些判断的代码
            {
                p = new Pen(this.BackColor, borderWidth);//使用背景色
                //p = new Pen(Color.Red, borderWidth);
                float x = 1 + gapWidth + borderWidth * 0.5f;
                rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                g.DrawEllipse(p, rec);//画圆环
            }

            #endregion

            #region 3,渐变色绘制,是否高亮

            if (isHighLight)
            {
                //if (isBorder)
                //{
                //    //先确定路径
                //    GraphicsPath gp = new GraphicsPath();
                //    //float x = 1 + gapWidth + borderWidth * 0.5f;//如果坐标是这个,会有点覆盖圆环
                //    float x = 1 + gapWidth + borderWidth;
                //    rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                //    gp.AddEllipse(rec);//把矩形添加到路径

                //    //渐变色画刷,高亮
                //    PathGradientBrush pgb=new PathGradientBrush(gp);//把路径传入

                //    pgb.CenterColor = this.centerColor;

                //    //设置有多少组颜色来渐变
                //    pgb.SurroundColors=new Color[]
                //    {
                //        ledColor
                //    };
                //    g.FillPath(pgb,gp);
                //}
                //else
                //{
                //    //先确定路径
                //    GraphicsPath gp = new GraphicsPath();
                //    float x = 1 ;
                //    rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                //    gp.AddEllipse(rec);

                //    //渐变色画刷,高亮
                //    PathGradientBrush pgb = new PathGradientBrush(gp);

                //    pgb.CenterColor = this.centerColor;

                //    pgb.SurroundColors = new Color[]
                //    {
                //        ledColor
                //    };
                //    g.FillPath(pgb, gp);
                //}


                //优化上面的if else代码
                GraphicsPath gp = new GraphicsPath();
                float x = isBorder? 1 + gapWidth + borderWidth:1;//使用三元运算来判断,优化代码
                rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                gp.AddEllipse(rec);//把矩形添加到路径

                //渐变色画刷,高亮
                PathGradientBrush pgb = new PathGradientBrush(gp);//把路径传入

                pgb.CenterColor = this.centerColor;

                //设置有多少组颜色来渐变
                pgb.SurroundColors = new Color[]
                {
                        ledColor
                };
                g.FillPath(pgb, gp);
            }

            #endregion


        }

        #endregion
    }

 

圆的绘制的坐标说明:

 

 

圆环的绘制的坐标说明:

 

二,在项目中使用自定义控件

1,拖入MyLED控件

2,在主程序中根据状态,来改变MyLED控件的颜色

            bool myLEDStatus = true;
            this.myLED1.LedColor = myLEDStatus ? Color.LimeGreen : Color.Red;

  

上面用法比较通用,用起来麻烦,如果项目中只是true或false,对自定义控件进行改造

 

三,针对上述调用问题进行改造

1,增加三个属性

        private Color ledTrueColor = Color.Green;

        [Category("jason控件属性")]
        [Description("TRUE的时候LED指示灯颜色")]
        public Color LedTrueColor
        {
            get { return ledTrueColor; }
            set
            {
                ledTrueColor = value;
                this.Invalidate();
            }
        }

        private Color ledFalseColor = Color.Red;

        [Category("jason控件属性")]
        [Description("False的时候LED指示灯颜色")]
        public Color LedFalseColor
        {
            get { return ledFalseColor; }
            set
            {
                ledFalseColor = value;
                this.Invalidate();
            }
        }

        private bool ledStatus = true;

        [Category("jason控件属性")]
        [Description("当前的状态")]
        public bool LedStatus
        {
            get { return ledStatus; }
            set
            {
                ledStatus = value;
                this.Invalidate();
            }
        }

  

2,把根据状态来判断颜色的代码写在自定义控件里面

 

 

3,在主程序中调用,一句代码就可以了

            this.myLED1.LedStatus = true;
            //或者this.myLED1.LedStatus = false;

  

此时代码如下:

    public partial class MyLED : UserControl
    {
        public MyLED()
        {
            
            InitializeComponent();

            #region 【1】设置双缓冲等属性

            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            this.SetStyle(ControlStyles.DoubleBuffer, true);
            this.SetStyle(ControlStyles.ResizeRedraw, true);
            this.SetStyle(ControlStyles.Selectable, true);
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.SetStyle(ControlStyles.UserPaint, true);

            #endregion

        }

        #region 【2】定义三个字段

        private Graphics g;
        private Pen p;
        private SolidBrush sb;

        #endregion

        #region 【3】添加一个设置Graphics的方法
        
        private void SetGraphics(Graphics g)
        {
            //设置画布的属性
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        }

        #endregion

        #region 【4】根据实际控件分析的结果,创建属性

        private Color ledTrueColor = Color.Green;

        [Category("jason控件属性")]
        [Description("TRUE的时候LED指示灯颜色")]
        public Color LedTrueColor
        {
            get { return ledTrueColor; }
            set
            {
                ledTrueColor = value;
                this.Invalidate();
            }
        }

        private Color ledFalseColor = Color.Red;

        [Category("jason控件属性")]
        [Description("False的时候LED指示灯颜色")]
        public Color LedFalseColor
        {
            get { return ledFalseColor; }
            set
            {
                ledFalseColor = value;
                this.Invalidate();
            }
        }

        private bool ledStatus = true;

        [Category("jason控件属性")]
        [Description("当前的状态")]
        public bool LedStatus
        {
            get { return ledStatus; }
            set
            {
                ledStatus = value;
                this.Invalidate();
            }
        }

        private Color ledColor = Color.Green;

        [Category("jason控件属性")]
        [Description("LED指示灯演示")]
        public Color LedColor
        {
            get { return ledColor; }
            set
            {
                ledColor = value;
                this.Invalidate();
            }
        }

        private bool isBorder = true;

        [Category("jason控件属性")]
        [Description("是否有边框")]
        public bool IsBorder
        {
            get { return isBorder; }
            set
            {
                isBorder = value;
                this.Invalidate();
            }
        }

        private int borderWidth = 5;

        [Category("jason控件属性")]
        [Description("圆环的宽度")]
        public int BorderWidth
        {
            get { return borderWidth; }
            set
            {
                borderWidth = value;
                this.Invalidate();
            }
        }

        private int gapWidth = 5;

        [Category("jason控件属性")]
        [Description("间隙的宽度")]
        public int GapWidth
        {
            get { return gapWidth; }
            set
            {
                gapWidth = value;
                this.Invalidate();
            }
        }

        private bool isHighLight = true;

        [Category("jason控件属性")]
        [Description("是否高亮")]
        public bool IsHighLight
        {
            get { return isHighLight; }
            set
            {
                isHighLight = value;
                this.Invalidate();
            }
        }

        private Color centerColor = Color.White;

        [Category("jason控件属性")]
        [Description("渐变中心的颜色")]
        public Color CenterColor
        {
            get { return centerColor; }
            set
            {
                centerColor = value;
                this.Invalidate();
            }
        }

        #endregion

        #region 【5】创建重绘的事件

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            g = e.Graphics;//获取画布
            SetGraphics(g);//设置画布

            #region 1,画一个圆

            int LEDWidth = Math.Min(this.Width, this.Height);

            Color color = ledStatus ? ledTrueColor : ledFalseColor;
            //sb = new SolidBrush(ledColor);
            sb = new SolidBrush(color);
            RectangleF rec = new RectangleF(1, 1, LEDWidth - 2, LEDWidth - 2);//创建矩形
            g.FillEllipse(sb, rec);//画圆

            #endregion

            #region 2,在圆里面画一个圆环

            //如果有边框,那就画一个圆环
            if (isBorder)//参数这里用字段或属性都可以,如果用属性,程序要都走一些判断的代码
            {
                p = new Pen(this.BackColor, borderWidth);//使用背景色
                //p = new Pen(Color.Red, borderWidth);
                float x = 1 + gapWidth + borderWidth * 0.5f;
                rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                g.DrawEllipse(p, rec);//画圆环
            }

            #endregion

            #region 3,渐变色绘制,是否高亮

            if (isHighLight)
            {
                GraphicsPath gp = new GraphicsPath();
                float x = isBorder? 1 + gapWidth + borderWidth:1;//使用三元运算来判断,优化代码
                rec = new RectangleF(x, x, LEDWidth - 2 * x, LEDWidth - 2 * x);
                gp.AddEllipse(rec);//把矩形添加到路径

                //渐变色画刷,高亮
                PathGradientBrush pgb = new PathGradientBrush(gp);//把路径传入

                pgb.CenterColor = this.centerColor;

                //设置有多少组颜色来渐变
                pgb.SurroundColors = new Color[]
                {
                        //ledColor
                        color
                };
                g.FillPath(pgb, gp);
            }

            #endregion


        }

        #endregion
    }

  

 

标签:控件,LED,自定义,Color,private,new,true,public
来源: https://www.cnblogs.com/baozi789654/p/14256924.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有