前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
麻烦博客下方点个【推荐】,谢谢
NuGet
Install-Package HZH_Controls
目录
https://www.cnblogs.com/bfyx/p/11364884.html
用处及效果
准备工作
依然使用GDI+绘画,这个比较简单,就是画圆
开始
新增一个类UCSignalLamp,继承UserControl
添加属性
1 ///2 /// The is show border 3 /// 4 private bool isShowBorder = false; 5 6 /// 7 /// Gets or sets a value indicating whether this instance is show border. 8 /// 9 /// true if this instance is show border; otherwise, false. 10 [Description("是否显示边框"), Category("自定义")] 11 public bool IsShowBorder 12 { 13 get { return isShowBorder; } 14 set 15 { 16 isShowBorder = value; 17 Refresh(); 18 } 19 } 20 21 /// 22 /// The lamp color 23 /// 24 private Color[] lampColor = new Color[] { Color.FromArgb(255, 77, 59) }; 25 26 /// 27 /// Gets or sets the color of the lamp. 28 /// 29 /// The color of the lamp. 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 /// 44 /// The is highlight 45 /// 46 private bool isHighlight = true; 47 48 /// 49 /// Gets or sets a value indicating whether this instance is highlight. 50 /// 51 /// true if this instance is highlight; otherwise, false. 52 [Description("是否高亮显示"), Category("自定义")] 53 public bool IsHighlight 54 { 55 get { return isHighlight; } 56 set 57 { 58 isHighlight = value; 59 Refresh(); 60 } 61 } 62 63 /// 64 /// The twinkle speed 65 /// 66 private int twinkleSpeed = 0; 67 68 /// 69 /// Gets or sets the twinkle speed. 70 /// 71 /// The twinkle speed. 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 /// 95 /// The timer 96 /// 97 Timer timer; 98 /// 99 /// The int color index 100 /// 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 //7 // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:[email protected] 8 // 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 /// 28 /// Class UCSignalLamp. 29 /// Implements the 30 /// 31 /// 32 public class UCSignalLamp : UserControl 33 { 34 /// 35 /// The is show border 36 /// 37 private bool isShowBorder = false; 38 39 /// 40 /// Gets or sets a value indicating whether this instance is show border. 41 /// 42 /// true if this instance is show border; otherwise, false. 43 [Description("是否显示边框"), Category("自定义")] 44 public bool IsShowBorder 45 { 46 get { return isShowBorder; } 47 set 48 { 49 isShowBorder = value; 50 Refresh(); 51 } 52 } 53 54 /// 55 /// The lamp color 56 /// 57 private Color[] lampColor = new Color[] { Color.FromArgb(255, 77, 59) }; 58 59 /// 60 /// Gets or sets the color of the lamp. 61 /// 62 /// The color of the lamp. 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 /// 77 /// The is highlight 78 /// 79 private bool isHighlight = true; 80 81 /// 82 /// Gets or sets a value indicating whether this instance is highlight. 83 /// 84 /// true if this instance is highlight; otherwise, false. 85 [Description("是否高亮显示"), Category("自定义")] 86 public bool IsHighlight 87 { 88 get { return isHighlight; } 89 set 90 { 91 isHighlight = value; 92 Refresh(); 93 } 94 } 95 96 /// 97 /// The twinkle speed 98 /// 99 private int twinkleSpeed = 0; 100 101 /// 102 /// Gets or sets the twinkle speed. 103 /// 104 /// The twinkle speed. 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 /// 128 /// The timer 129 /// 130 Timer timer; 131 /// 132 /// The int color index 133 /// 134 int intColorIndex = 0; 135 /// 136 /// Initializes a new instance of the class. 137 /// 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 /// 155 /// Handles the Tick event of the timer control. 156 /// 157 /// The source of the event. 158 /// The instance containing the event data. 159 void timer_Tick(object sender, EventArgs e) 160 { 161 intColorIndex++; 162 if (intColorIndex >= lampColor.Length) 163 intColorIndex = 0; 164 Refresh(); 165 } 166 /// 167 /// Handles the SizeChanged event of the UCSignalLamp control. 168 /// 169 /// The source of the event. 170 /// The instance containing the event data. 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 /// 181 /// 引发 事件。 182 /// 183 /// 包含事件数据的 。 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 点个星星吧