欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

(四十四)c#Winform自定义控件-水波

程序员文章站 2022-04-10 23:31:43
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:https://gitee.com/kwwwvagaa/net_winform_custom_contr ......

前提

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

github:https://github.com/kwwwvagaa/netwinformcontrol

码云:

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

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

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

nuget

install-package hzh_controls

目录

用处及效果

(四十四)c#Winform自定义控件-水波

准备工作

这个用的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         /// <summary>
12         /// 为方便计算,强制使用10的倍数
13         /// </summary>
14         [description("波纹宽度(为方便计算,强制使用10的倍数)"), category("自定义")]
15         public int wavewidth
16         {
17             get { return m_wavewidth; }
18             set
19             {
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         /// <summary>
28         /// 波高
29         /// </summary>
30         [description("波高"), category("自定义")]
31         public int waveheight
32         {
33             get { return m_waveheight; }
34             set { m_waveheight = value; }
35         }
36 
37         private int m_wavesleep = 50;
38         /// <summary>
39         /// 波运行速度(运行时间间隔,毫秒)
40         /// </summary>
41         [description("波运行速度(运行时间间隔,毫秒)"), category("自定义")]
42         public int wavesleep
43         {
44             get { return m_wavesleep; }
45             set
46             {
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             list<point> lst1 = new list<point>();
 7             list<point> lst2 = new list<point>();
 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         /// <summary>
 25         /// 为方便计算,强制使用10的倍数
 26         /// </summary>
 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         /// <summary>
 41         /// 波高
 42         /// </summary>
 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         /// <summary>
 52         /// 波运行速度(运行时间间隔,毫秒)
 53         /// </summary>
 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             list<point> lst1 = new list<point>();
106             list<point> lst2 = new list<point>();
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 }

 

最后的话

如果你喜欢的话,请到  点个星星吧