• (六十一)c#Winform自定义控件-信号灯(工业)-HZHControls


    官网

    http://www.hzhcontrols.com

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    麻烦博客下方点个【推荐】,谢谢

    NuGet

    Install-Package HZH_Controls

    目录

    https://www.cnblogs.com/bfyx/p/11364884.html

    用处及效果

    准备工作

    依然使用GDI+绘画,这个比较简单,就是画圆

    开始

    新增一个类UCSignalLamp,继承UserControl

    添加属性

      1 /// <summary>
      2         /// The is show border
      3         /// </summary>
      4         private bool isShowBorder = false;
      5 
      6         /// <summary>
      7         /// Gets or sets a value indicating whether this instance is show border.
      8         /// </summary>
      9         /// <value><c>true</c> if this instance is show border; otherwise, <c>false</c>.</value>
     10         [Description("是否显示边框"), Category("自定义")]
     11         public bool IsShowBorder
     12         {
     13             get { return isShowBorder; }
     14             set
     15             {
     16                 isShowBorder = value;
     17                 Refresh();
     18             }
     19         }
     20 
     21         /// <summary>
     22         /// The lamp color
     23         /// </summary>
     24         private Color[] lampColor = new Color[] { Color.FromArgb(255, 77, 59) };
     25 
     26         /// <summary>
     27         /// Gets or sets the color of the lamp.
     28         /// </summary>
     29         /// <value>The color of the lamp.</value>
     30         [Description("灯颜色,当需要闪烁时,至少需要2个及以上颜色,不需要闪烁则至少需要1个颜色"), Category("自定义")]
     31         public Color[] LampColor
     32         {
     33             get { return lampColor; }
     34             set
     35             {
     36                 if (value == null || value.Length <= 0)
     37                     return;
     38                 lampColor = value;
     39                 Refresh();
     40             }
     41         }
     42 
     43         /// <summary>
     44         /// The is highlight
     45         /// </summary>
     46         private bool isHighlight = true;
     47 
     48         /// <summary>
     49         /// Gets or sets a value indicating whether this instance is highlight.
     50         /// </summary>
     51         /// <value><c>true</c> if this instance is highlight; otherwise, <c>false</c>.</value>
     52         [Description("是否高亮显示"), Category("自定义")]
     53         public bool IsHighlight
     54         {
     55             get { return isHighlight; }
     56             set
     57             {
     58                 isHighlight = value;
     59                 Refresh();
     60             }
     61         }
     62 
     63         /// <summary>
     64         /// The twinkle speed
     65         /// </summary>
     66         private int twinkleSpeed = 0;
     67 
     68         /// <summary>
     69         /// Gets or sets the twinkle speed.
     70         /// </summary>
     71         /// <value>The twinkle speed.</value>
     72         [Description("闪烁间隔时间(毫秒),当为0时不闪烁"), Category("自定义")]
     73         public int TwinkleSpeed
     74         {
     75             get { return twinkleSpeed; }
     76             set
     77             {
     78                 if (value < 0)
     79                     return;
     80                 twinkleSpeed = value;
     81                 if (value == 0 || lampColor.Length <= 1)
     82                 {
     83                     timer.Enabled = false;
     84                 }
     85                 else
     86                 {
     87                     intColorIndex = 0;
     88                     timer.Interval = value;
     89                     timer.Enabled = true;
     90                 }
     91                 Refresh();
     92             }
     93         }
     94         /// <summary>
     95         /// The timer
     96         /// </summary>
     97         Timer timer;
     98         /// <summary>
     99         /// The int color index
    100         /// </summary>
    101         int intColorIndex = 0;

    重绘

     1  protected override void OnPaint(PaintEventArgs e)
     2         {
     3             base.OnPaint(e);
     4             var g = e.Graphics;
     5             g.SetGDIHigh();
     6             Color c1 = lampColor[intColorIndex];
     7             g.FillEllipse(new SolidBrush(c1), this.ClientRectangle);
     8 
     9             if (isHighlight)
    10             {
    11                 GraphicsPath gp = new GraphicsPath();
    12 
    13                 Rectangle rec = new Rectangle(5, 5, this.Width - 10, this.Height - 10);
    14                 gp.AddEllipse(rec);
    15 
    16                 Color[] surroundColor = new Color[] { c1 };
    17                 PathGradientBrush pb = new PathGradientBrush(gp);
    18                 pb.CenterColor = Color.White;
    19                 pb.SurroundColors = surroundColor;
    20                 g.FillPath(pb, gp);
    21             }
    22 
    23             if (isShowBorder)
    24             {
    25                 g.DrawEllipse(new Pen(new SolidBrush(this.BackColor), 2), new Rectangle(4, 4, this.Width - 8, this.Height - 8));
    26             }
    27         }

    全部代码

      1 // ***********************************************************************
      2 // Assembly         : HZH_Controls
      3 // Created          : 2019-09-09
      4 //
      5 // ***********************************************************************
      6 // <copyright file="UCSignalLamp.cs">
      7 //     Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
      8 // </copyright>
      9 //
     10 // Blog: https://www.cnblogs.com/bfyx
     11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl
     12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
     13 //
     14 // If you use this code, please keep this note.
     15 // ***********************************************************************
     16 using System;
     17 using System.Collections.Generic;
     18 using System.Linq;
     19 using System.Text;
     20 using System.Windows.Forms;
     21 using System.Drawing;
     22 using System.Drawing.Drawing2D;
     23 using System.ComponentModel;
     24 
     25 namespace HZH_Controls.Controls.FactoryControls.Lamp
     26 {
     27     /// <summary>
     28     /// Class UCSignalLamp.
     29     /// Implements the <see cref="System.Windows.Forms.UserControl" />
     30     /// </summary>
     31     /// <seealso cref="System.Windows.Forms.UserControl" />
     32     public class UCSignalLamp : UserControl
     33     {
     34         /// <summary>
     35         /// The is show border
     36         /// </summary>
     37         private bool isShowBorder = false;
     38 
     39         /// <summary>
     40         /// Gets or sets a value indicating whether this instance is show border.
     41         /// </summary>
     42         /// <value><c>true</c> if this instance is show border; otherwise, <c>false</c>.</value>
     43         [Description("是否显示边框"), Category("自定义")]
     44         public bool IsShowBorder
     45         {
     46             get { return isShowBorder; }
     47             set
     48             {
     49                 isShowBorder = value;
     50                 Refresh();
     51             }
     52         }
     53 
     54         /// <summary>
     55         /// The lamp color
     56         /// </summary>
     57         private Color[] lampColor = new Color[] { Color.FromArgb(255, 77, 59) };
     58 
     59         /// <summary>
     60         /// Gets or sets the color of the lamp.
     61         /// </summary>
     62         /// <value>The color of the lamp.</value>
     63         [Description("灯颜色,当需要闪烁时,至少需要2个及以上颜色,不需要闪烁则至少需要1个颜色"), Category("自定义")]
     64         public Color[] LampColor
     65         {
     66             get { return lampColor; }
     67             set
     68             {
     69                 if (value == null || value.Length <= 0)
     70                     return;
     71                 lampColor = value;
     72                 Refresh();
     73             }
     74         }
     75 
     76         /// <summary>
     77         /// The is highlight
     78         /// </summary>
     79         private bool isHighlight = true;
     80 
     81         /// <summary>
     82         /// Gets or sets a value indicating whether this instance is highlight.
     83         /// </summary>
     84         /// <value><c>true</c> if this instance is highlight; otherwise, <c>false</c>.</value>
     85         [Description("是否高亮显示"), Category("自定义")]
     86         public bool IsHighlight
     87         {
     88             get { return isHighlight; }
     89             set
     90             {
     91                 isHighlight = value;
     92                 Refresh();
     93             }
     94         }
     95 
     96         /// <summary>
     97         /// The twinkle speed
     98         /// </summary>
     99         private int twinkleSpeed = 0;
    100 
    101         /// <summary>
    102         /// Gets or sets the twinkle speed.
    103         /// </summary>
    104         /// <value>The twinkle speed.</value>
    105         [Description("闪烁间隔时间(毫秒),当为0时不闪烁"), Category("自定义")]
    106         public int TwinkleSpeed
    107         {
    108             get { return twinkleSpeed; }
    109             set
    110             {
    111                 if (value < 0)
    112                     return;
    113                 twinkleSpeed = value;
    114                 if (value == 0 || lampColor.Length <= 1)
    115                 {
    116                     timer.Enabled = false;
    117                 }
    118                 else
    119                 {
    120                     intColorIndex = 0;
    121                     timer.Interval = value;
    122                     timer.Enabled = true;
    123                 }
    124                 Refresh();
    125             }
    126         }
    127         /// <summary>
    128         /// The timer
    129         /// </summary>
    130         Timer timer;
    131         /// <summary>
    132         /// The int color index
    133         /// </summary>
    134         int intColorIndex = 0;
    135         /// <summary>
    136         /// Initializes a new instance of the <see cref="UCSignalLamp"/> class.
    137         /// </summary>
    138         public UCSignalLamp()
    139         {
    140             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    141             this.SetStyle(ControlStyles.DoubleBuffer, true);
    142             this.SetStyle(ControlStyles.ResizeRedraw, true);
    143             this.SetStyle(ControlStyles.Selectable, true);
    144             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    145             this.SetStyle(ControlStyles.UserPaint, true);
    146             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
    147             this.Size = new Size(50, 50);
    148             this.SizeChanged += UCSignalLamp_SizeChanged;
    149             timer = new Timer();
    150             timer.Interval = 200;
    151             timer.Tick += timer_Tick;
    152         }
    153 
    154         /// <summary>
    155         /// Handles the Tick event of the timer control.
    156         /// </summary>
    157         /// <param name="sender">The source of the event.</param>
    158         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    159         void timer_Tick(object sender, EventArgs e)
    160         {
    161             intColorIndex++;
    162             if (intColorIndex >= lampColor.Length)
    163                 intColorIndex = 0;
    164             Refresh();
    165         }
    166         /// <summary>
    167         /// Handles the SizeChanged event of the UCSignalLamp control.
    168         /// </summary>
    169         /// <param name="sender">The source of the event.</param>
    170         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    171         void UCSignalLamp_SizeChanged(object sender, EventArgs e)
    172         {
    173             var maxSize = Math.Min(this.Width, this.Height);
    174             if (this.Width != maxSize)
    175                 this.Width = maxSize;
    176             if (this.Height != maxSize)
    177                 this.Height = maxSize;
    178         }
    179 
    180         /// <summary>
    181         /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
    182         /// </summary>
    183         /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" /></param>
    184         protected override void OnPaint(PaintEventArgs e)
    185         {
    186             base.OnPaint(e);
    187             var g = e.Graphics;
    188             g.SetGDIHigh();
    189             Color c1 = lampColor[intColorIndex];
    190             g.FillEllipse(new SolidBrush(c1), this.ClientRectangle);
    191 
    192             if (isHighlight)
    193             {
    194                 GraphicsPath gp = new GraphicsPath();
    195 
    196                 Rectangle rec = new Rectangle(5, 5, this.Width - 10, this.Height - 10);
    197                 gp.AddEllipse(rec);
    198 
    199                 Color[] surroundColor = new Color[] { c1 };
    200                 PathGradientBrush pb = new PathGradientBrush(gp);
    201                 pb.CenterColor = Color.White;
    202                 pb.SurroundColors = surroundColor;
    203                 g.FillPath(pb, gp);
    204             }
    205 
    206             if (isShowBorder)
    207             {
    208                 g.DrawEllipse(new Pen(new SolidBrush(this.BackColor), 2), new Rectangle(4, 4, this.Width - 8, this.Height - 8));
    209             }
    210         }
    211     }
    212 }
    View Code

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

  • 相关阅读:
    Socket listen 简要分析
    Socket connect 等简要分析
    HIVE函数大全
    元数据管理
    flume
    shell编程
    数据仓库集锦
    数据库知识
    hive sql 转化mapreduce原理
    Hadoop 学习笔记
  • 原文地址:https://www.cnblogs.com/bfyx/p/11492401.html
Copyright © 2020-2023  润新知