
(四十四)c#Winform自定义控件-水波-HZHControls
View Code
发布日期:2021-05-09 00:53:04
浏览次数:11
分类:博客文章
本文共 8772 字,大约阅读时间需要 29 分钟。
官网
前提
入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:
码云:
如果觉得写的还行,请点个 star 支持一下吧
欢迎前来交流探讨: 企鹅群568015492
麻烦博客下方点个【推荐】,谢谢
NuGet
Install-Package HZH_Controls
目录
用处及效果
准备工作
这个用的GDI+画的,如果不了解,可以百度一下。
开始
添加一个类 UCWave ,继承Control
定义属性
1 private Color m_waveColor = Color.FromArgb(73, 119, 232); 2 3 [Description("波纹颜色"), Category("自定义")] 4 public Color WaveColor 5 { 6 get { return m_waveColor; } 7 set { m_waveColor = value; } 8 } 9 10 private int m_waveWidth = 200;11 ///12 /// 为方便计算,强制使用10的倍数13 /// 14 [Description("波纹宽度(为方便计算,强制使用10的倍数)"), Category("自定义")]15 public int WaveWidth16 {17 get { return m_waveWidth; }18 set19 {20 m_waveWidth = value;21 m_waveWidth = m_waveWidth / 10 * 10;22 intLeftX = value * -1;23 }24 }25 26 private int m_waveHeight = 30;27 ///28 /// 波高29 /// 30 [Description("波高"), Category("自定义")]31 public int WaveHeight32 {33 get { return m_waveHeight; }34 set { m_waveHeight = value; }35 }36 37 private int m_waveSleep = 50;38 ///39 /// 波运行速度(运行时间间隔,毫秒)40 /// 41 [Description("波运行速度(运行时间间隔,毫秒)"), Category("自定义")]42 public int WaveSleep43 {44 get { return m_waveSleep; }45 set46 {47 if (value <= 0)48 return;49 m_waveSleep = value;50 if (timer != null)51 {52 timer.Enabled = false;53 timer.Interval = value;54 timer.Enabled = true;55 }56 }57 }58 59 Timer timer = new Timer();60 int intLeftX = -200;
重绘
1 protected override void OnPaint(PaintEventArgs e) 2 { 3 base.OnPaint(e); 4 var g = e.Graphics; 5 g.SetGDIHigh(); 6 Listlst1 = new List (); 7 List lst2 = new List (); 8 int m_intX = intLeftX; 9 while (true)10 {11 lst1.Add(new Point(m_intX, 1));12 lst1.Add(new Point(m_intX + m_waveWidth / 2, m_waveHeight));13 14 lst2.Add(new Point(m_intX + m_waveWidth / 4, 1));15 lst2.Add(new Point(m_intX + m_waveWidth / 4 + m_waveWidth / 2, m_waveHeight));16 m_intX += m_waveWidth;17 if (m_intX > this.Width + m_waveWidth)18 break;19 }20 21 GraphicsPath path1 = new GraphicsPath();22 path1.AddCurve(lst1.ToArray(), 0.5F);23 path1.AddLine(this.Width + 1, -1, this.Width + 1, this.Height);24 path1.AddLine(this.Width + 1, this.Height, -1, this.Height);25 path1.AddLine(-1, this.Height, -1, -1);26 27 GraphicsPath path2 = new GraphicsPath();28 path2.AddCurve(lst2.ToArray(), 0.5F);29 path2.AddLine(this.Width + 1, -1, this.Width + 1, this.Height);30 path2.AddLine(this.Width + 1, this.Height, -1, this.Height);31 path2.AddLine(-1, this.Height, -1, -1);32 33 g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path1);34 g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path2);35 }
为了“波动”,添加定时器,定时器事件如下
1 void timer_Tick(object sender, EventArgs e)2 {3 intLeftX -= 10;4 if (intLeftX == m_waveWidth * -2)5 intLeftX = m_waveWidth * -1;6 this.Refresh();7 }
完整代码
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Drawing; 5 using System.Drawing.Drawing2D; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace HZH_Controls.Controls 11 { 12 public class UCWave : Control 13 { 14 private Color m_waveColor = Color.FromArgb(73, 119, 232); 15 16 [Description("波纹颜色"), Category("自定义")] 17 public Color WaveColor 18 { 19 get { return m_waveColor; } 20 set { m_waveColor = value; } 21 } 22 23 private int m_waveWidth = 200; 24 ///25 /// 为方便计算,强制使用10的倍数 26 /// 27 [Description("波纹宽度(为方便计算,强制使用10的倍数)"), Category("自定义")] 28 public int WaveWidth 29 { 30 get { return m_waveWidth; } 31 set 32 { 33 m_waveWidth = value; 34 m_waveWidth = m_waveWidth / 10 * 10; 35 intLeftX = value * -1; 36 } 37 } 38 39 private int m_waveHeight = 30; 40 ///41 /// 波高 42 /// 43 [Description("波高"), Category("自定义")] 44 public int WaveHeight 45 { 46 get { return m_waveHeight; } 47 set { m_waveHeight = value; } 48 } 49 50 private int m_waveSleep = 50; 51 ///52 /// 波运行速度(运行时间间隔,毫秒) 53 /// 54 [Description("波运行速度(运行时间间隔,毫秒)"), Category("自定义")] 55 public int WaveSleep 56 { 57 get { return m_waveSleep; } 58 set 59 { 60 if (value <= 0) 61 return; 62 m_waveSleep = value; 63 if (timer != null) 64 { 65 timer.Enabled = false; 66 timer.Interval = value; 67 timer.Enabled = true; 68 } 69 } 70 } 71 72 Timer timer = new Timer(); 73 int intLeftX = -200; 74 public UCWave() 75 { 76 this.Size = new Size(600, 100); 77 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 78 this.SetStyle(ControlStyles.DoubleBuffer, true); 79 this.SetStyle(ControlStyles.ResizeRedraw, true); 80 this.SetStyle(ControlStyles.Selectable, true); 81 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true); 82 this.SetStyle(ControlStyles.UserPaint, true); 83 timer.Interval = m_waveSleep; 84 timer.Tick += timer_Tick; 85 this.VisibleChanged += UCWave_VisibleChanged; 86 } 87 88 void UCWave_VisibleChanged(object sender, EventArgs e) 89 { 90 timer.Enabled = this.Visible; 91 } 92 93 void timer_Tick(object sender, EventArgs e) 94 { 95 intLeftX -= 10; 96 if (intLeftX == m_waveWidth * -2) 97 intLeftX = m_waveWidth * -1; 98 this.Refresh(); 99 }100 protected override void OnPaint(PaintEventArgs e)101 {102 base.OnPaint(e);103 var g = e.Graphics;104 g.SetGDIHigh();105 Listlst1 = new List ();106 List lst2 = new List ();107 int m_intX = intLeftX;108 while (true)109 {110 lst1.Add(new Point(m_intX, 1));111 lst1.Add(new Point(m_intX + m_waveWidth / 2, m_waveHeight));112 113 lst2.Add(new Point(m_intX + m_waveWidth / 4, 1));114 lst2.Add(new Point(m_intX + m_waveWidth / 4 + m_waveWidth / 2, m_waveHeight));115 m_intX += m_waveWidth;116 if (m_intX > this.Width + m_waveWidth)117 break;118 }119 120 GraphicsPath path1 = new GraphicsPath();121 path1.AddCurve(lst1.ToArray(), 0.5F);122 path1.AddLine(this.Width + 1, -1, this.Width + 1, this.Height);123 path1.AddLine(this.Width + 1, this.Height, -1, this.Height);124 path1.AddLine(-1, this.Height, -1, -1);125 126 GraphicsPath path2 = new GraphicsPath();127 path2.AddCurve(lst2.ToArray(), 0.5F);128 path2.AddLine(this.Width + 1, -1, this.Width + 1, this.Height);129 path2.AddLine(this.Width + 1, this.Height, -1, this.Height);130 path2.AddLine(-1, this.Height, -1, -1);131 132 g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path1);133 g.FillPath(new SolidBrush(Color.FromArgb(220, m_waveColor.R, m_waveColor.G, m_waveColor.B)), path2);134 }135 }136 }
最后的话
如果你喜欢的话,请到 点个星星吧
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月24日 11时02分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
云计算之路-阿里云上:2014年6月12日12点IIS请求到达量突降
2021-05-09
上周热点回顾(6.9-6.15)
2021-05-09
上周热点回顾(6.16-6.22)
2021-05-09
上周热点回顾(10.20-10.26)
2021-05-09
上周热点回顾(2.16-2.22)
2021-05-09
上周热点回顾(3.2-3.8)
2021-05-09
.NET跨平台之旅:借助ASP.NET 5 Beta5的新特性显示CLR与操作系统信息
2021-05-09
上周热点回顾(7.27-8.2)
2021-05-09
上周热点回顾(9.28-10.4)
2021-05-09
上周热点回顾(5.2-5.8)
2021-05-09
上周热点回顾(5.9-5.15)
2021-05-09
上周热点回顾(8.8-8.14)
2021-05-09
.NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1
2021-05-09
上周热点回顾(1.16-1.22)
2021-05-09
上周热点回顾(1.23-1.29)
2021-05-09
上周热点回顾(3.20-3.26)
2021-05-09
上周热点回顾(4.24-4.30)
2021-05-09
[故障公告]博客站点1台负载均衡遭遇流量攻击,造成联通与移动用户无法正常访问
2021-05-09
上周热点回顾(5.1-5.7)
2021-05-09