前提

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

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

码云:

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

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

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

nuget

install-package hzh_controls

目录

用处及效果

准备工作

使用gdi+画的,用到了三角函数,如果不了解可以先行百度

开始

添加一个类ucconduit,继承usercontrol

添加几个属性

  1 /// <summary>
  2         /// the conduit style
  3         /// </summary>
  4         private conduitstyle conduitstyle = conduitstyle.horizontal_none_none;
  5 
  6         /// <summary>
  7         /// gets or sets the conduit style.
  8         /// </summary>
  9         /// <value>the conduit style.</value>
 10         [description("样式"), category("自定义")]
 11         public conduitstyle conduitstyle
 12         {
 13             get { return conduitstyle; }
 14             set
 15             {
 16                 string strold = conduitstyle.tostring().substring(0, 1);
 17                 string strnew = value.tostring().substring(0, 1);
 18                 conduitstyle = value;
 19                 if (strold != strnew)
 20                 {
 21                     this.size = new size(this.size.height, this.size.width);
 22                 }
 23                 refresh();
 24             }
 25         }
 26 
 27         /// <summary>
 28         /// the conduit color
 29         /// </summary>
 30         private color conduitcolor = color.fromargb(255, 77, 59);
 31         [description("颜色"), category("自定义")]
 32         /// <summary>
 33         /// gets or sets the color of the conduit.
 34         /// </summary>
 35         /// <value>the color of the conduit.</value>
 36         public color conduitcolor
 37         {
 38             get { return conduitcolor; }
 39             set
 40             {
 41                 conduitcolor = value;
 42                 refresh();
 43             }
 44         }
 45 
 46         /// <summary>
 47         /// the liquid color
 48         /// </summary>
 49         private color liquidcolor = color.fromargb(3, 169, 243);
 50 
 51         /// <summary>
 52         /// gets or sets the color of the liquid.
 53         /// </summary>
 54         /// <value>the color of the liquid.</value>
 55         [description("液体颜色"), category("自定义")]
 56         public color liquidcolor
 57         {
 58             get { return liquidcolor; }
 59             set
 60             {
 61                 liquidcolor = value;
 62                 if (liquiddirection != conduit.liquiddirection.none)
 63                     refresh();
 64             }
 65         }
 66 
 67         /// <summary>
 68         /// the liquid direction
 69         /// </summary>
 70         private liquiddirection liquiddirection = liquiddirection.forward;
 71 
 72         /// <summary>
 73         /// gets or sets the liquid direction.
 74         /// </summary>
 75         /// <value>the liquid direction.</value>
 76         [description("液体流动方向"), category("自定义")]
 77         public liquiddirection liquiddirection
 78         {
 79             get { return liquiddirection; }
 80             set
 81             {
 82                 liquiddirection = value;
 83                 refresh();
 84             }
 85         }
 86 
 87         /// <summary>
 88         /// the liquid speed
 89         /// </summary>
 90         private int liquidspeed = 100;
 91 
 92         /// <summary>
 93         /// 液体流速,越小,速度越快gets or sets the liquid speed.
 94         /// </summary>
 95         /// <value>the liquid speed.</value>
 96         [description("液体流速,越小,速度越快"), category("自定义")]
 97         public int liquidspeed
 98         {
 99             get { return liquidspeed; }
100             set
101             {
102                 if (value <= 0)
103                     return;
104                 liquidspeed = value;
105                 m_timer.interval = value;
106             }
107         }
108 
109         /// <summary>
110         /// the int pen width
111         /// </summary>
112         int intpenwidth = 0;
113 
114         /// <summary>
115         /// the int line left
116         /// </summary>
117         int intlineleft = 0;
118         /// <summary>
119         /// the m timer
120         /// </summary>
121         timer m_timer;

根据参数设置重绘

  1 /// <summary>
2         /// 引发 <see cref="e:system.windows.forms.control.paint" /> 事件。
3         /// </summary>
4         /// <param name="e">包含事件数据的 <see cref="t:system.windows.forms.painteventargs" />。</param>
5         protected override void onpaint(painteventargs e)
6         {
7             base.onpaint(e);
8             graphics g = e.graphics;
9 
10             list<arcentity> lstarcs = new list<arcentity>();
11 
12             graphicspath path = new graphicspath();
13             graphicspath linepath = new graphicspath();
14             switch (conduitstyle)
15             {
16                 #region h    english:h
17                 case conduitstyle.horizontal_none_none:
18                     path.addlines(new pointf[]
19                     { 
20                         new pointf(0, 0), 
21                         new pointf(this.clientrectangle.right, 0),
22                         new pointf(this.clientrectangle.right, this.height),
23                         new pointf(0, this.height)
24                     });
25                     path.closeallfigures();
26                     linepath.addline(0, this.height / 2, this.width, this.height / 2);
27                     break;
28                 case conduitstyle.horizontal_up_none:
29                     path.addlines(new pointf[]
30                     { 
31                         new pointf(0, 0), 
32                         new pointf(this.clientrectangle.right, 0),
33                         new pointf(this.clientrectangle.right, this.height),
34                         new pointf(0+intpenwidth, this.height)
35                     });
36                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
37                     path.closeallfigures();
38 
39                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
40                     linepath.addline(intpenwidth, this.height / 2, this.width, this.height / 2);
41 
42                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
43                     break;
44                 case conduitstyle.horizontal_down_none:
45                     path.addlines(new pointf[]
46                     { 
47                         new pointf(intpenwidth, 0), 
48                         new pointf(this.clientrectangle.right, 0),
49                         new pointf(this.clientrectangle.right, this.height),
50                         new pointf(0, this.height)
51                     });
52                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
53                     path.closeallfigures();
54 
55                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
56                     linepath.addline(intpenwidth + 1, this.height / 2, this.width, this.height / 2);
57 
58                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
59                     break;
60                 case conduitstyle.horizontal_none_up:
61                     path.addlines(new pointf[]
62                     { 
63                         new pointf(this.clientrectangle.right-intpenwidth, this.height),
64                         new pointf(0, this.height),
65                         new pointf(0, 0), 
66                         new pointf(this.clientrectangle.right-intpenwidth, 0)
67                     });
68                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
69                     path.closeallfigures();
70 
71                     linepath.addline(0, this.height / 2, this.width - intpenwidth, this.height / 2);
72                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
73 
74                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
75                     break;
76                 case conduitstyle.horizontal_none_down:
77                     path.addlines(new pointf[]
78                     { 
79                         new pointf(this.clientrectangle.right, this.height),
80                         new pointf(0, this.height),
81                         new pointf(0, 0), 
82                         new pointf(this.clientrectangle.right-intpenwidth, 0)
83                     });
84                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
85                     path.closeallfigures();
86 
87                     linepath.addline(0, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
88                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
89 
90                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
91                     break;
92                 case conduitstyle.horizontal_down_up:
93                     path.addline(new point(intpenwidth, 0), new point(this.width, 0));
94                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
95                     path.addline(new point(this.width - intpenwidth, this.height), new point(0, this.height));
96                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
97                     path.closeallfigures();
98 
99                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
100                     //linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth, this.height / 2);
101                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
102 
103                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
104                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
105                     break;
106                 case conduitstyle.horizontal_up_down:
107                     path.addline(new point(0, 0), new point(this.width - intpenwidth, 0));
108                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
109                     path.addline(new point(this.width, this.height), new point(intpenwidth, this.height));
110                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
111                     path.closeallfigures();
112 
113                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
114                     linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
115                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
116 
117                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
118                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
119                     break;
120                 case conduitstyle.horizontal_up_up:
121                     path.addline(new point(0, 0), new point(this.width, 0));
122                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
123                     path.addline(new point(this.width - intpenwidth, this.height), new point(intpenwidth, this.height));
124                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
125                     path.closeallfigures();
126 
127                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
128                     //linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth, this.height / 2);
129                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
130 
131                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
132                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
133                     break;
134                 case conduitstyle.horizontal_down_down:
135                     path.addline(new point(intpenwidth, 0), new point(this.width - intpenwidth, 0));
136                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
137                     path.addline(new point(this.width, this.height), new point(0, this.height));
138                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
139                     path.closeallfigures();
140 
141                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
142                     linepath.addline(intpenwidth + 1, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
143                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
144 
145                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
146                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
147                     break;
148                 #endregion
149 
150                 #region v    english:v
151                 case conduitstyle.vertical_none_none:
152                     path.addlines(new pointf[]
153                     { 
154                         new pointf(0, 0), 
155                         new pointf(this.clientrectangle.right, 0),
156                         new pointf(this.clientrectangle.right, this.height),
157                         new pointf(0, this.height)
158                     });
159                     path.closeallfigures();
160                     linepath.addline(this.width / 2, 0, this.width / 2, this.height);
161                     break;
162                 case conduitstyle.vertical_left_none:
163                     path.addlines(new pointf[]
164                     { 
165                         new pointf(this.clientrectangle.right, intpenwidth),
166                         new pointf(this.clientrectangle.right, this.height),
167                         new pointf(0, this.height),
168                         new pointf(0, 0)
169                     });
170                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
171                     path.closeallfigures();
172 
173                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
174                     linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height);
175 
176                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
177                     break;
178                 case conduitstyle.vertical_right_none:
179                     path.addlines(new pointf[]
180                     { 
181                         new pointf(this.clientrectangle.right, 0),
182                         new pointf(this.clientrectangle.right, this.height),
183                         new pointf(0, this.height),
184                         new pointf(0, intpenwidth)
185                     });
186                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
187                     path.closeallfigures();
188 
189                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
190                     linepath.addline(intpenwidth / 2, intpenwidth + 1, intpenwidth / 2, this.height);
191 
192                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
193                     break;
194                 case conduitstyle.vertical_none_left:
195                     path.addlines(new pointf[]
196                     { 
197                         new pointf(0, this.height),
198                         new pointf(0, 0),
199                         new pointf(this.clientrectangle.right, 0),
200                         new pointf(this.clientrectangle.right, this.height-intpenwidth),
201                     });
202                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
203                     path.closeallfigures();
204 
205                     linepath.addline(this.width / 2, 0, this.width / 2, this.height - intpenwidth);
206                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
207 
208                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
209                     break;
210                 case conduitstyle.vertical_none_right:
211                     path.addlines(new pointf[]
212                     { 
213                         new pointf(0, this.height-intpenwidth),
214                         new pointf(0, 0),
215                         new pointf(this.clientrectangle.right, 0),
216                         new pointf(this.clientrectangle.right, this.height),
217                     });
218                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
219                     path.closeallfigures();
220 
221                     linepath.addline(this.width / 2, 0, this.width / 2, this.height - intpenwidth - 1);
222                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
223 
224                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
225                     break;
226                 case conduitstyle.vertical_left_right:
227                     path.addline(this.width, intpenwidth, this.width, this.height);
228                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
229                     path.addline(0, this.height - intpenwidth, 0, 0);
230                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
231                     path.closeallfigures();
232 
233                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
234                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
235                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
236 
237                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
238                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
239                     break;
240                 case conduitstyle.vertical_right_left:
241                     path.addline(this.width, 0, this.width, this.height - intpenwidth);
242                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
243                     path.addline(0, this.height, 0, intpenwidth);
244                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
245                     path.closeallfigures();
246 
247                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
248                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
249                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
250 
251                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
252                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
253                     break;
254                 case conduitstyle.vertical_left_left:
255                     path.addline(this.width, intpenwidth, this.width, this.height - intpenwidth);
256                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
257                     path.addline(0, this.height, 0, 0);
258                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
259                     path.closeallfigures();
260 
261                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
262                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
263                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
264 
265                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
266                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
267                     break;
268                 case conduitstyle.vertical_right_right:
269                     path.addline(this.width, 0, this.width, this.height);
270                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
271                     path.addline(0, this.height - intpenwidth, 0, intpenwidth);
272                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
273                     path.closeallfigures();
274 
275                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
276                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
277                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 180, -91);
278 
279                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
280                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
281                     break;
282                 #endregion
283             }
284             g.fillpath(new solidbrush(conduitcolor), path);
285 
286             //渐变色
287             int intcount = intpenwidth / 2 / 4;
288             int intsplit = (255 - 100) / intcount;
289             for (int i = 0; i < intcount; i++)
290             {
291                 int _penwidth = intpenwidth / 2 - 4 * i;
292                 if (_penwidth <= 0)
293                     _penwidth = 1;
294                 g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), linepath);
295                 if (_penwidth == 1)
296                     break;
297             }
298 
299             g.setgdihigh();
300             //使用抗锯齿画圆角
301             foreach (var item in lstarcs)
302             {
303                 g.drawarc(new pen(new solidbrush(this.backcolor)), item.rect, item.startangle, item.sweepangle);
304             }
305 
306             //液体流动
307             if (liquiddirection != conduit.liquiddirection.none)
308             {
309                 pen p = new pen(new solidbrush(liquidcolor), 4);
310                 p.dashpattern = new float[] { 6, 6 };
311                 p.dashoffset = intlineleft * (liquiddirection == conduit.liquiddirection.forward ? -1 : 1);
312                 g.drawpath(p, linepath);
313             }
314         }

一个记录圆角的类

 1  /// <summary>
2         /// class arcentity.
3         /// </summary>
4         class arcentity
5         {
6             /// <summary>
7             /// gets or sets the rect.
8             /// </summary>
9             /// <value>the rect.</value>
10             public rectangle rect { get; set; }
11             /// <summary>
12             /// gets or sets the start angle.
13             /// </summary>
14             /// <value>the start angle.</value>
15             public float startangle { get; set; }
16             /// <summary>
17             /// gets or sets the sweep angle.
18             /// </summary>
19             /// <value>the sweep angle.</value>
20             public float sweepangle { get; set; }
21         }

2个枚举

 1 /// <summary>
2     /// enum liquiddirection
3     /// </summary>
4     public enum liquiddirection
5     {
6         /// <summary>
7         /// the none
8         /// </summary>
9         none,
10         /// <summary>
11         /// the forward
12         /// </summary>
13         forward,
14         /// <summary>
15         /// the backward
16         /// </summary>
17         backward
18     }
19 
20     /// <summary>
21     /// 管道样式enum conduitstyle
22     /// </summary>
23     public enum conduitstyle
24     {
25         /// <summary>
26         /// 直线 the horizontal none none
27         /// </summary>
28         horizontal_none_none,
29         /// <summary>
30         /// 左上the horizontal up none
31         /// </summary>
32         horizontal_up_none,
33         /// <summary>
34         /// 左下the horizontal down none
35         /// </summary>
36         horizontal_down_none,
37         /// <summary>
38         /// 右上the horizontal none up
39         /// </summary>
40         horizontal_none_up,
41         /// <summary>
42         /// 右下the horizontal none down
43         /// </summary>
44         horizontal_none_down,
45         /// <summary>
46         /// 左下右上the horizontal down up
47         /// </summary>
48         horizontal_down_up,
49         /// <summary>
50         /// 左上右下the horizontal up down
51         /// </summary>
52         horizontal_up_down,
53         /// <summary>
54         /// 左上,右上the horizontal up up
55         /// </summary>
56         horizontal_up_up,
57         /// <summary>
58         /// 左下右下the horizontal down down
59         /// </summary>
60         horizontal_down_down,
61 
62         /// <summary>
63         /// 竖线the vertical none none
64         /// </summary>
65         vertical_none_none,
66         /// <summary>
67         /// 上左the vertical left none
68         /// </summary>
69         vertical_left_none,
70         /// <summary>
71         /// 上右the vertical right none
72         /// </summary>
73         vertical_right_none,
74         /// <summary>
75         /// 下左the vertical none left
76         /// </summary>
77         vertical_none_left,
78         /// <summary>
79         /// 下右the vertical none right
80         /// </summary>
81         vertical_none_right,
82         /// <summary>
83         /// 上左下右the vertical left right
84         /// </summary>
85         vertical_left_right,
86         /// <summary>
87         /// 上右下左the vertical right left
88         /// </summary>
89         vertical_right_left,
90         /// <summary>
91         /// 上左下左the vertical left left
92         /// </summary>
93         vertical_left_left,
94         /// <summary>
95         /// 上右下右the vertical right left
96         /// </summary>
97         vertical_right_right,
98     }

重点讲解来了,

重绘的时候,先填充底色,并且记录下中心线path,和圆角

填充底色后,画中间的渐变色

然后设置g为抗锯齿模式,把圆角重画一遍,就没有锯齿感了

然后根据中心线,画液体就可以了

完整代码

  1 // ***********************************************************************
2 // assembly         : hzh_controls
3 // created          : 2019-09-04
4 //
5 // ***********************************************************************
6 // <copyright file="ucconduit.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.conduit
26 {
27     /// <summary>
28     /// class ucconduit.
29     /// implements the <see cref="system.windows.forms.usercontrol" />
30     /// </summary>
31     /// <seealso cref="system.windows.forms.usercontrol" />
32     public class ucconduit : usercontrol
33     {
34         /// <summary>
35         /// the conduit style
36         /// </summary>
37         private conduitstyle conduitstyle = conduitstyle.horizontal_none_none;
38 
39         /// <summary>
40         /// gets or sets the conduit style.
41         /// </summary>
42         /// <value>the conduit style.</value>
43         [description("样式"), category("自定义")]
44         public conduitstyle conduitstyle
45         {
46             get { return conduitstyle; }
47             set
48             {
49                 string strold = conduitstyle.tostring().substring(0, 1);
50                 string strnew = value.tostring().substring(0, 1);
51                 conduitstyle = value;
52                 if (strold != strnew)
53                 {
54                     this.size = new size(this.size.height, this.size.width);
55                 }
56                 refresh();
57             }
58         }
59 
60         /// <summary>
61         /// the conduit color
62         /// </summary>
63         private color conduitcolor = color.fromargb(255, 77, 59);
64         [description("颜色"), category("自定义")]
65         /// <summary>
66         /// gets or sets the color of the conduit.
67         /// </summary>
68         /// <value>the color of the conduit.</value>
69         public color conduitcolor
70         {
71             get { return conduitcolor; }
72             set
73             {
74                 conduitcolor = value;
75                 refresh();
76             }
77         }
78 
79         /// <summary>
80         /// the liquid color
81         /// </summary>
82         private color liquidcolor = color.fromargb(3, 169, 243);
83 
84         /// <summary>
85         /// gets or sets the color of the liquid.
86         /// </summary>
87         /// <value>the color of the liquid.</value>
88         [description("液体颜色"), category("自定义")]
89         public color liquidcolor
90         {
91             get { return liquidcolor; }
92             set
93             {
94                 liquidcolor = value;
95                 if (liquiddirection != conduit.liquiddirection.none)
96                     refresh();
97             }
98         }
99 
100         /// <summary>
101         /// the liquid direction
102         /// </summary>
103         private liquiddirection liquiddirection = liquiddirection.forward;
104 
105         /// <summary>
106         /// gets or sets the liquid direction.
107         /// </summary>
108         /// <value>the liquid direction.</value>
109         [description("液体流动方向"), category("自定义")]
110         public liquiddirection liquiddirection
111         {
112             get { return liquiddirection; }
113             set
114             {
115                 liquiddirection = value;
116                 refresh();
117             }
118         }
119 
120         /// <summary>
121         /// the liquid speed
122         /// </summary>
123         private int liquidspeed = 100;
124 
125         /// <summary>
126         /// 液体流速,越小,速度越快gets or sets the liquid speed.
127         /// </summary>
128         /// <value>the liquid speed.</value>
129         [description("液体流速,越小,速度越快"), category("自定义")]
130         public int liquidspeed
131         {
132             get { return liquidspeed; }
133             set
134             {
135                 if (value <= 0)
136                     return;
137                 liquidspeed = value;
138                 m_timer.interval = value;
139             }
140         }
141 
142         /// <summary>
143         /// the int pen width
144         /// </summary>
145         int intpenwidth = 0;
146 
147         /// <summary>
148         /// the int line left
149         /// </summary>
150         int intlineleft = 0;
151         /// <summary>
152         /// the m timer
153         /// </summary>
154         timer m_timer;
155         /// <summary>
156         /// initializes a new instance of the <see cref="ucconduit"/> class.
157         /// </summary>
158         public ucconduit()
159         {
160             this.setstyle(controlstyles.allpaintinginwmpaint, true);
161             this.setstyle(controlstyles.doublebuffer, true);
162             this.setstyle(controlstyles.resizeredraw, true);
163             this.setstyle(controlstyles.selectable, true);
164             this.setstyle(controlstyles.supportstransparentbackcolor, true);
165             this.setstyle(controlstyles.userpaint, true);
166             this.autoscalemode = system.windows.forms.autoscalemode.none;
167             this.sizechanged += ucconduit_sizechanged;
168             this.size = new size(200, 50);
169             m_timer = new timer();
170             m_timer.interval = 100;
171             m_timer.tick += timer_tick;
172             m_timer.enabled = true;
173         }
174 
175         /// <summary>
176         /// handles the tick event of the timer control.
177         /// </summary>
178         /// <param name="sender">the source of the event.</param>
179         /// <param name="e">the <see cref="eventargs"/> instance containing the event data.</param>
180         void timer_tick(object sender, eventargs e)
181         {
182             intlineleft += 2;
183             if (intlineleft > 12)
184                 intlineleft = 0;
185             refresh();
186         }
187 
188 
189         /// <summary>
190         /// handles the sizechanged event of the ucconduit control.
191         /// </summary>
192         /// <param name="sender">the source of the event.</param>
193         /// <param name="e">the <see cref="eventargs"/> instance containing the event data.</param>
194         void ucconduit_sizechanged(object sender, eventargs e)
195         {
196             intpenwidth = conduitstyle.tostring().startswith("h") ? this.height : this.width;
197         }
198 
199         /// <summary>
200         /// 引发 <see cref="e:system.windows.forms.control.paint" /> 事件。
201         /// </summary>
202         /// <param name="e">包含事件数据的 <see cref="t:system.windows.forms.painteventargs" />。</param>
203         protected override void onpaint(painteventargs e)
204         {
205             base.onpaint(e);
206             graphics g = e.graphics;
207 
208             list<arcentity> lstarcs = new list<arcentity>();
209 
210             graphicspath path = new graphicspath();
211             graphicspath linepath = new graphicspath();
212             switch (conduitstyle)
213             {
214                 #region h    english:h
215                 case conduitstyle.horizontal_none_none:
216                     path.addlines(new pointf[]
217                     { 
218                         new pointf(0, 0), 
219                         new pointf(this.clientrectangle.right, 0),
220                         new pointf(this.clientrectangle.right, this.height),
221                         new pointf(0, this.height)
222                     });
223                     path.closeallfigures();
224                     linepath.addline(0, this.height / 2, this.width, this.height / 2);
225                     break;
226                 case conduitstyle.horizontal_up_none:
227                     path.addlines(new pointf[]
228                     { 
229                         new pointf(0, 0), 
230                         new pointf(this.clientrectangle.right, 0),
231                         new pointf(this.clientrectangle.right, this.height),
232                         new pointf(0+intpenwidth, this.height)
233                     });
234                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
235                     path.closeallfigures();
236 
237                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
238                     linepath.addline(intpenwidth, this.height / 2, this.width, this.height / 2);
239 
240                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
241                     break;
242                 case conduitstyle.horizontal_down_none:
243                     path.addlines(new pointf[]
244                     { 
245                         new pointf(intpenwidth, 0), 
246                         new pointf(this.clientrectangle.right, 0),
247                         new pointf(this.clientrectangle.right, this.height),
248                         new pointf(0, this.height)
249                     });
250                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
251                     path.closeallfigures();
252 
253                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
254                     linepath.addline(intpenwidth + 1, this.height / 2, this.width, this.height / 2);
255 
256                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
257                     break;
258                 case conduitstyle.horizontal_none_up:
259                     path.addlines(new pointf[]
260                     { 
261                         new pointf(this.clientrectangle.right-intpenwidth, this.height),
262                         new pointf(0, this.height),
263                         new pointf(0, 0), 
264                         new pointf(this.clientrectangle.right-intpenwidth, 0)
265                     });
266                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
267                     path.closeallfigures();
268 
269                     linepath.addline(0, this.height / 2, this.width - intpenwidth, this.height / 2);
270                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
271 
272                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
273                     break;
274                 case conduitstyle.horizontal_none_down:
275                     path.addlines(new pointf[]
276                     { 
277                         new pointf(this.clientrectangle.right, this.height),
278                         new pointf(0, this.height),
279                         new pointf(0, 0), 
280                         new pointf(this.clientrectangle.right-intpenwidth, 0)
281                     });
282                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
283                     path.closeallfigures();
284 
285                     linepath.addline(0, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
286                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
287 
288                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
289                     break;
290                 case conduitstyle.horizontal_down_up:
291                     path.addline(new point(intpenwidth, 0), new point(this.width, 0));
292                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
293                     path.addline(new point(this.width - intpenwidth, this.height), new point(0, this.height));
294                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
295                     path.closeallfigures();
296 
297                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
298                     //linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth, this.height / 2);
299                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
300 
301                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
302                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
303                     break;
304                 case conduitstyle.horizontal_up_down:
305                     path.addline(new point(0, 0), new point(this.width - intpenwidth, 0));
306                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
307                     path.addline(new point(this.width, this.height), new point(intpenwidth, this.height));
308                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
309                     path.closeallfigures();
310 
311                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
312                     linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
313                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
314 
315                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
316                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
317                     break;
318                 case conduitstyle.horizontal_up_up:
319                     path.addline(new point(0, 0), new point(this.width, 0));
320                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 0, 90);
321                     path.addline(new point(this.width - intpenwidth, this.height), new point(intpenwidth, this.height));
322                     path.addarc(new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), 90, 90);
323                     path.closeallfigures();
324 
325                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
326                     //linepath.addline(intpenwidth, this.height / 2, this.width - intpenwidth, this.height / 2);
327                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, -1 * intpenwidth / 2 - 1, intpenwidth, intpenwidth), 91, -91);
328 
329                     lstarcs.add(new arcentity() { rect = new rectangle(0, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
330                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, intpenwidth * -1, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
331                     break;
332                 case conduitstyle.horizontal_down_down:
333                     path.addline(new point(intpenwidth, 0), new point(this.width - intpenwidth, 0));
334                     path.addarc(new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), 270, 90);
335                     path.addline(new point(this.width, this.height), new point(0, this.height));
336                     path.addarc(new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), 180, 90);
337                     path.closeallfigures();
338 
339                     linepath.addarc(new rectangle(intpenwidth / 2 + 1, this.height / 2, intpenwidth, intpenwidth), 179, 91);
340                     linepath.addline(intpenwidth + 1, this.height / 2, this.width - intpenwidth - 1, this.height / 2);
341                     linepath.addarc(new rectangle(this.clientrectangle.right - intpenwidth - intpenwidth / 2 - 1, intpenwidth / 2, intpenwidth, intpenwidth), 269, 91);
342 
343                     lstarcs.add(new arcentity() { rect = new rectangle(0, -1, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
344                     lstarcs.add(new arcentity() { rect = new rectangle(this.clientrectangle.right - intpenwidth * 2, -1, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
345                     break;
346                 #endregion
347 
348                 #region v    english:v
349                 case conduitstyle.vertical_none_none:
350                     path.addlines(new pointf[]
351                     { 
352                         new pointf(0, 0), 
353                         new pointf(this.clientrectangle.right, 0),
354                         new pointf(this.clientrectangle.right, this.height),
355                         new pointf(0, this.height)
356                     });
357                     path.closeallfigures();
358                     linepath.addline(this.width / 2, 0, this.width / 2, this.height);
359                     break;
360                 case conduitstyle.vertical_left_none:
361                     path.addlines(new pointf[]
362                     { 
363                         new pointf(this.clientrectangle.right, intpenwidth),
364                         new pointf(this.clientrectangle.right, this.height),
365                         new pointf(0, this.height),
366                         new pointf(0, 0)
367                     });
368                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
369                     path.closeallfigures();
370 
371                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
372                     linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height);
373 
374                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
375                     break;
376                 case conduitstyle.vertical_right_none:
377                     path.addlines(new pointf[]
378                     { 
379                         new pointf(this.clientrectangle.right, 0),
380                         new pointf(this.clientrectangle.right, this.height),
381                         new pointf(0, this.height),
382                         new pointf(0, intpenwidth)
383                     });
384                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
385                     path.closeallfigures();
386 
387                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
388                     linepath.addline(intpenwidth / 2, intpenwidth + 1, intpenwidth / 2, this.height);
389 
390                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
391                     break;
392                 case conduitstyle.vertical_none_left:
393                     path.addlines(new pointf[]
394                     { 
395                         new pointf(0, this.height),
396                         new pointf(0, 0),
397                         new pointf(this.clientrectangle.right, 0),
398                         new pointf(this.clientrectangle.right, this.height-intpenwidth),
399                     });
400                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
401                     path.closeallfigures();
402 
403                     linepath.addline(this.width / 2, 0, this.width / 2, this.height - intpenwidth);
404                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
405 
406                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
407                     break;
408                 case conduitstyle.vertical_none_right:
409                     path.addlines(new pointf[]
410                     { 
411                         new pointf(0, this.height-intpenwidth),
412                         new pointf(0, 0),
413                         new pointf(this.clientrectangle.right, 0),
414                         new pointf(this.clientrectangle.right, this.height),
415                     });
416                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
417                     path.closeallfigures();
418 
419                     linepath.addline(this.width / 2, 0, this.width / 2, this.height - intpenwidth - 1);
420                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
421 
422                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
423                     break;
424                 case conduitstyle.vertical_left_right:
425                     path.addline(this.width, intpenwidth, this.width, this.height);
426                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
427                     path.addline(0, this.height - intpenwidth, 0, 0);
428                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
429                     path.closeallfigures();
430 
431                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
432                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
433                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 181, -91);
434 
435                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
436                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
437                     break;
438                 case conduitstyle.vertical_right_left:
439                     path.addline(this.width, 0, this.width, this.height - intpenwidth);
440                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
441                     path.addline(0, this.height, 0, intpenwidth);
442                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
443                     path.closeallfigures();
444 
445                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
446                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
447                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
448 
449                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
450                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
451                     break;
452                 case conduitstyle.vertical_left_left:
453                     path.addline(this.width, intpenwidth, this.width, this.height - intpenwidth);
454                     path.addarc(new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 0, 90);
455                     path.addline(0, this.height, 0, 0);
456                     path.addarc(new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), 270, 90);
457                     path.closeallfigures();
458 
459                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 269, 91);
460                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
461                     linepath.addarc(new rectangle(-1 * intpenwidth / 2 - 1, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), -1, 91);
462 
463                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, 0, intpenwidth * 2, intpenwidth * 2), startangle = 270, sweepangle = 90 });
464                     lstarcs.add(new arcentity() { rect = new rectangle(-1 * intpenwidth, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 0, sweepangle = 90 });
465                     break;
466                 case conduitstyle.vertical_right_right:
467                     path.addline(this.width, 0, this.width, this.height);
468                     path.addarc(new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), 90, 90);
469                     path.addline(0, this.height - intpenwidth, 0, intpenwidth);
470                     path.addarc(new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), 180, 90);
471                     path.closeallfigures();
472 
473                     linepath.addarc(new rectangle(intpenwidth / 2, intpenwidth / 2 + 1, intpenwidth, intpenwidth), 271, -91);
474                     //linepath.addline(intpenwidth / 2, intpenwidth, intpenwidth / 2, this.height - intpenwidth);
475                     linepath.addarc(new rectangle(intpenwidth / 2, this.height - intpenwidth - intpenwidth / 2 - 1, intpenwidth, intpenwidth), 180, -91);
476 
477                     lstarcs.add(new arcentity() { rect = new rectangle(-1, 0, intpenwidth * 2, intpenwidth * 2), startangle = 180, sweepangle = 90 });
478                     lstarcs.add(new arcentity() { rect = new rectangle(-1, this.height - intpenwidth * 2, intpenwidth * 2, intpenwidth * 2), startangle = 90, sweepangle = 90 });
479                     break;
480                 #endregion
481             }
482             g.fillpath(new solidbrush(conduitcolor), path);
483 
484             //渐变色
485             int intcount = intpenwidth / 2 / 4;
486             int intsplit = (255 - 100) / intcount;
487             for (int i = 0; i < intcount; i++)
488             {
489                 int _penwidth = intpenwidth / 2 - 4 * i;
490                 if (_penwidth <= 0)
491                     _penwidth = 1;
492                 g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), linepath);
493                 if (_penwidth == 1)
494                     break;
495             }
496 
497             g.setgdihigh();
498             //使用抗锯齿画圆角
499             foreach (var item in lstarcs)
500             {
501                 g.drawarc(new pen(new solidbrush(this.backcolor)), item.rect, item.startangle, item.sweepangle);
502             }
503 
504             //液体流动
505             if (liquiddirection != conduit.liquiddirection.none)
506             {
507                 pen p = new pen(new solidbrush(liquidcolor), 4);
508                 p.dashpattern = new float[] { 6, 6 };
509                 p.dashoffset = intlineleft * (liquiddirection == conduit.liquiddirection.forward ? -1 : 1);
510                 g.drawpath(p, linepath);
511             }
512         }
513 
514 
515         /// <summary>
516         /// class arcentity.
517         /// </summary>
518         class arcentity
519         {
520             /// <summary>
521             /// gets or sets the rect.
522             /// </summary>
523             /// <value>the rect.</value>
524             public rectangle rect { get; set; }
525             /// <summary>
526             /// gets or sets the start angle.
527             /// </summary>
528             /// <value>the start angle.</value>
529             public float startangle { get; set; }
530             /// <summary>
531             /// gets or sets the sweep angle.
532             /// </summary>
533             /// <value>the sweep angle.</value>
534             public float sweepangle { get; set; }
535         }
536 
537     }
538 
539     /// <summary>
540     /// enum liquiddirection
541     /// </summary>
542     public enum liquiddirection
543     {
544         /// <summary>
545         /// the none
546         /// </summary>
547         none,
548         /// <summary>
549         /// the forward
550         /// </summary>
551         forward,
552         /// <summary>
553         /// the backward
554         /// </summary>
555         backward
556     }
557 
558     /// <summary>
559     /// 管道样式enum conduitstyle
560     /// </summary>
561     public enum conduitstyle
562     {
563         /// <summary>
564         /// 直线 the horizontal none none
565         /// </summary>
566         horizontal_none_none,
567         /// <summary>
568         /// 左上the horizontal up none
569         /// </summary>
570         horizontal_up_none,
571         /// <summary>
572         /// 左下the horizontal down none
573         /// </summary>
574         horizontal_down_none,
575         /// <summary>
576         /// 右上the horizontal none up
577         /// </summary>
578         horizontal_none_up,
579         /// <summary>
580         /// 右下the horizontal none down
581         /// </summary>
582         horizontal_none_down,
583         /// <summary>
584         /// 左下右上the horizontal down up
585         /// </summary>
586         horizontal_down_up,
587         /// <summary>
588         /// 左上右下the horizontal up down
589         /// </summary>
590         horizontal_up_down,
591         /// <summary>
592         /// 左上,右上the horizontal up up
593         /// </summary>
594         horizontal_up_up,
595         /// <summary>
596         /// 左下右下the horizontal down down
597         /// </summary>
598         horizontal_down_down,
599 
600         /// <summary>
601         /// 竖线the vertical none none
602         /// </summary>
603         vertical_none_none,
604         /// <summary>
605         /// 上左the vertical left none
606         /// </summary>
607         vertical_left_none,
608         /// <summary>
609         /// 上右the vertical right none
610         /// </summary>
611         vertical_right_none,
612         /// <summary>
613         /// 下左the vertical none left
614         /// </summary>
615         vertical_none_left,
616         /// <summary>
617         /// 下右the vertical none right
618         /// </summary>
619         vertical_none_right,
620         /// <summary>
621         /// 上左下右the vertical left right
622         /// </summary>
623         vertical_left_right,
624         /// <summary>
625         /// 上右下左the vertical right left
626         /// </summary>
627         vertical_right_left,
628         /// <summary>
629         /// 上左下左the vertical left left
630         /// </summary>
631         vertical_left_left,
632         /// <summary>
633         /// 上右下右the vertical right left
634         /// </summary>
635         vertical_right_right,
636     }
637 }

 

最后的话

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