前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
麻烦博客下方点个【推荐】,谢谢
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 }
最后的话
如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧