前提

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

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

码云:

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

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

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

nuget

install-package hzh_controls

目录

用处及效果

可用作水泵,风机,涡轮等

准备工作

gdi+画的,不懂的可以自行百度一下

开始

添加2个枚举,分别控制进出风口的位置

 1   /// <summary>
 2     /// enum blowerentrancedirection
 3     /// </summary>
 4     public enum blowerentrancedirection
 5     {
 6         /// <summary>
 7         /// the none
 8         /// </summary>
 9         none,
10         /// <summary>
11         /// the left
12         /// </summary>
13         left,
14         /// <summary>
15         /// the right
16         /// </summary>
17         right,
18         /// <summary>
19         /// up
20         /// </summary>
21         up
22     }
23 
24     /// <summary>
25     /// enum blowerexitdirection
26     /// </summary>
27     public enum blowerexitdirection
28     {
29         /// <summary>
30         /// the left
31         /// </summary>
32         left,
33         /// <summary>
34         /// the right
35         /// </summary>
36         right,
37         /// <summary>
38         /// up
39         /// </summary>
40         up
41     }

属性

 1  /// <summary>
 2         /// the entrance direction
 3         /// </summary>
 4         private blowerentrancedirection entrancedirection = blowerentrancedirection.none;
 5 
 6         /// <summary>
 7         /// gets or sets the entrance direction.
 8         /// </summary>
 9         /// <value>the entrance direction.</value>
10         [description("入口方向"), category("自定义")]
11         public blowerentrancedirection entrancedirection
12         {
13             get { return entrancedirection; }
14             set
15             {
16                 entrancedirection = value;
17                 refresh();
18             }
19         }
20 
21         /// <summary>
22         /// the exit direction
23         /// </summary>
24         private blowerexitdirection exitdirection = blowerexitdirection.right;
25 
26         /// <summary>
27         /// gets or sets the exit direction.
28         /// </summary>
29         /// <value>the exit direction.</value>
30         [description("出口方向"), category("自定义")]
31         public blowerexitdirection exitdirection
32         {
33             get { return exitdirection; }
34             set
35             {
36                 exitdirection = value;
37                 refresh();
38             }
39         }
40 
41         /// <summary>
42         /// the blower color
43         /// </summary>
44         private color blowercolor = color.fromargb(255, 77, 59);
45 
46         /// <summary>
47         /// gets or sets the color of the blower.
48         /// </summary>
49         /// <value>the color of the blower.</value>
50         [description("风机颜色"), category("自定义")]
51         public color blowercolor
52         {
53             get { return blowercolor; }
54             set
55             {
56                 blowercolor = value;
57                 refresh();
58             }
59         }
60 
61         /// <summary>
62         /// the fan color
63         /// </summary>
64         private color fancolor = color.fromargb(3, 169, 243);
65 
66         /// <summary>
67         /// gets or sets the color of the fan.
68         /// </summary>
69         /// <value>the color of the fan.</value>
70         [description("风叶颜色"), category("自定义")]
71         public color fancolor
72         {
73             get { return fancolor; }
74             set
75             {
76                 fancolor = value;
77                 refresh();
78             }
79         }
80 
81         /// <summary>
82         /// the m rect working
83         /// </summary>
84         rectangle m_rectworking;

重绘

  1 protected override void onpaint(painteventargs e)
2         {
3             base.onpaint(e);
4             var g = e.graphics;
5             g.setgdihigh();
6             graphicspath pathlinein = new graphicspath();
7             graphicspath pathlineout = new graphicspath();
8             int intlinepenwidth = 0;
9 
10             switch (exitdirection)
11             {
12                 case blowerexitdirection.left:
13                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(0, m_rectworking.top, this.width / 2, m_rectworking.height / 2 - 5));
14                     intlinepenwidth = m_rectworking.height / 2 - 5;
15                     pathlineout.addline(new point(-10, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2));
16                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(1, m_rectworking.top - 2), new point(1, m_rectworking.top + (m_rectworking.height / 2 - 5) + 2));
17                     break;
18                 case blowerexitdirection.right:
19                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(this.width / 2, m_rectworking.top, this.width / 2, m_rectworking.height / 2 - 5));
20                     intlinepenwidth = m_rectworking.height / 2 - 5;
21                     pathlineout.addline(new point(this.width + 10, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2));
22                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(this.width - 2, m_rectworking.top - 2), new point(this.width - 2, m_rectworking.top + (m_rectworking.height / 2 - 5) + 2));
23                     break;
24                 case blowerexitdirection.up:
25                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(m_rectworking.right - (m_rectworking.width / 2 - 5), 0, m_rectworking.width / 2 - 5, this.height / 2));
26                     intlinepenwidth = m_rectworking.width / 2 - 5;
27                     pathlineout.addline(new point(m_rectworking.right - (m_rectworking.width / 2 - 5) / 2, -10), new point(m_rectworking.right - (m_rectworking.width / 2 - 5) / 2, m_rectworking.top + m_rectworking.height / 2));
28                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.right + 2, 1), new point(m_rectworking.right - (m_rectworking.width / 2 - 5) - 2, 1));
29                     break;
30             }
31 
32             switch (entrancedirection)
33             {
34                 case blowerentrancedirection.left:
35                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(0, m_rectworking.bottom - m_rectworking.height / 2 + 5, this.width / 2, m_rectworking.height / 2 - 5));
36                     pathlinein.addline(new point(-10, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2));
37                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(1, m_rectworking.bottom - m_rectworking.height / 2 + 5 - 2), new point(1, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) + 2));
38                     break;
39                 case blowerentrancedirection.right:
40                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(this.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5, this.width / 2, m_rectworking.height / 2 - 5));
41                     pathlinein.addline(new point(this.width + 10, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2));
42                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(this.width - 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 - 2), new point(this.width - 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) + 2));
43                     break;
44                 case blowerentrancedirection.up:
45                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(m_rectworking.left, 0, m_rectworking.width / 2 - 5, this.height / 2));
46                     pathlinein.addline(new point(m_rectworking.left + (m_rectworking.width / 2 - 5) / 2, -10), new point(m_rectworking.left + (m_rectworking.width / 2 - 5) / 2, m_rectworking.top + m_rectworking.height / 2));
47                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.left - 2, 1), new point(m_rectworking.left + (m_rectworking.width / 2 - 5) + 2, 1));
48                     break;
49             }
50 
51             //渐变色
52             int _intpenwidth = intlinepenwidth;
53             int intcount = _intpenwidth / 2 / 4;
54             for (int i = 0; i < intcount; i++)
55             {
56                 int _penwidth = _intpenwidth / 2 - 4 * i;
57                 if (_penwidth <= 0)
58                     _penwidth = 1;
59                 if (entrancedirection != blowerentrancedirection.none)
60                     g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), pathlinein);
61                 g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), pathlineout);
62                 if (_penwidth == 1)
63                     break;
64             }
65 
66             //底座
67             graphicspath gpdz = new graphicspath();
68             gpdz.addlines(new point[] 
69             {
70                 new point( m_rectworking.left+m_rectworking.width/2,m_rectworking.top+m_rectworking.height/2),
71                 new point(m_rectworking.left+2,this.height),
72                 new point(m_rectworking.right-2,this.height)
73             });
74             gpdz.closeallfigures();
75             g.fillpath(new solidbrush(blowercolor), gpdz);
76             g.fillpath(new solidbrush(color.fromargb(50, color.white)), gpdz);
77             g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.left, this.height - 2), new point(m_rectworking.right, this.height - 2));
78 
79             //中心
80             g.fillellipse(new solidbrush(blowercolor), m_rectworking);
81             g.fillellipse(new solidbrush(color.fromargb(20, color.white)), m_rectworking);
82 
83 
84             //扇叶
85             rectangle _rect = new rectangle(m_rectworking.left + (m_rectworking.width - (m_rectworking.width / 3 * 2)) / 2, m_rectworking.top + (m_rectworking.height - (m_rectworking.width / 3 * 2)) / 2, (m_rectworking.width / 3 * 2), (m_rectworking.width / 3 * 2));
86 
87             int _splitcount = 8;
88             float fltsplitvalue = 360f / (float)_splitcount;
89             for (int i = 0; i <= _splitcount; i++)
90             {
91                 float fltangle = (fltsplitvalue * i - 180) % 360;
92                 float flty1 = (float)(_rect.top + _rect.width / 2 - ((_rect.width / 2) * math.sin(math.pi * (fltangle / 180.00f))));
93                 float fltx1 = (float)(_rect.left + (_rect.width / 2 - ((_rect.width / 2) * math.cos(math.pi * (fltangle / 180.00f)))));
94                 float flty2 = 0;
95                 float fltx2 = 0;
96 
97                 flty2 = (float)(_rect.top + _rect.width / 2 - ((_rect.width / 4) * math.sin(math.pi * (fltangle / 180.00f))));
98                 fltx2 = (float)(_rect.left + (_rect.width / 2 - ((_rect.width / 4) * math.cos(math.pi * (fltangle / 180.00f)))));
99 
100                 g.drawline(new pen(new solidbrush(fancolor), 2), new pointf(fltx1, flty1), new pointf(fltx2, flty2));
101             }
102 
103             g.fillellipse(new solidbrush(fancolor), new rectangle(_rect.left + _rect.width / 2 - _rect.width / 4 + 2, _rect.top + _rect.width / 2 - _rect.width / 4 + 2, _rect.width / 2 - 4, _rect.width / 2 - 4));
104             g.fillellipse(new solidbrush(color.fromargb(50, color.white)), new rectangle(_rect.left - 5, _rect.top - 5, _rect.width + 10, _rect.height + 10));
105         }

全部代码

  1 // ***********************************************************************
2 // assembly         : hzh_controls
3 // created          : 2019-09-09
4 //
5 // ***********************************************************************
6 // <copyright file="ucblower.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
26 {
27     /// <summary>
28     /// class ucblower.
29     /// implements the <see cref="system.windows.forms.usercontrol" />
30     /// </summary>
31     /// <seealso cref="system.windows.forms.usercontrol" />
32     public class ucblower : usercontrol
33     {
34         /// <summary>
35         /// the entrance direction
36         /// </summary>
37         private blowerentrancedirection entrancedirection = blowerentrancedirection.none;
38 
39         /// <summary>
40         /// gets or sets the entrance direction.
41         /// </summary>
42         /// <value>the entrance direction.</value>
43         [description("入口方向"), category("自定义")]
44         public blowerentrancedirection entrancedirection
45         {
46             get { return entrancedirection; }
47             set
48             {
49                 entrancedirection = value;
50                 refresh();
51             }
52         }
53 
54         /// <summary>
55         /// the exit direction
56         /// </summary>
57         private blowerexitdirection exitdirection = blowerexitdirection.right;
58 
59         /// <summary>
60         /// gets or sets the exit direction.
61         /// </summary>
62         /// <value>the exit direction.</value>
63         [description("出口方向"), category("自定义")]
64         public blowerexitdirection exitdirection
65         {
66             get { return exitdirection; }
67             set
68             {
69                 exitdirection = value;
70                 refresh();
71             }
72         }
73 
74         /// <summary>
75         /// the blower color
76         /// </summary>
77         private color blowercolor = color.fromargb(255, 77, 59);
78 
79         /// <summary>
80         /// gets or sets the color of the blower.
81         /// </summary>
82         /// <value>the color of the blower.</value>
83         [description("风机颜色"), category("自定义")]
84         public color blowercolor
85         {
86             get { return blowercolor; }
87             set
88             {
89                 blowercolor = value;
90                 refresh();
91             }
92         }
93 
94         /// <summary>
95         /// the fan color
96         /// </summary>
97         private color fancolor = color.fromargb(3, 169, 243);
98 
99         /// <summary>
100         /// gets or sets the color of the fan.
101         /// </summary>
102         /// <value>the color of the fan.</value>
103         [description("风叶颜色"), category("自定义")]
104         public color fancolor
105         {
106             get { return fancolor; }
107             set
108             {
109                 fancolor = value;
110                 refresh();
111             }
112         }
113 
114         /// <summary>
115         /// the m rect working
116         /// </summary>
117         rectangle m_rectworking;
118 
119         /// <summary>
120         /// initializes a new instance of the <see cref="ucblower"/> class.
121         /// </summary>
122         public ucblower()
123         {
124             this.setstyle(controlstyles.allpaintinginwmpaint, true);
125             this.setstyle(controlstyles.doublebuffer, true);
126             this.setstyle(controlstyles.resizeredraw, true);
127             this.setstyle(controlstyles.selectable, true);
128             this.setstyle(controlstyles.supportstransparentbackcolor, true);
129             this.setstyle(controlstyles.userpaint, true);
130             this.autoscalemode = system.windows.forms.autoscalemode.none;
131             this.sizechanged += ucblower_sizechanged;
132             this.size = new size(120, 120);
133 
134         }
135 
136         /// <summary>
137         /// handles the sizechanged event of the ucblower control.
138         /// </summary>
139         /// <param name="sender">the source of the event.</param>
140         /// <param name="e">the <see cref="eventargs"/> instance containing the event data.</param>
141         void ucblower_sizechanged(object sender, eventargs e)
142         {
143             int intmin = math.min(this.width, this.height);
144             m_rectworking = new rectangle((this.width - (intmin / 3 * 2)) / 2, (this.height - (intmin / 3 * 2)) / 2, (intmin / 3 * 2), (intmin / 3 * 2));
145         }
146 
147         /// <summary>
148         /// 引发 <see cref="e:system.windows.forms.control.paint" /> 事件。
149         /// </summary>
150         /// <param name="e">包含事件数据的 <see cref="t:system.windows.forms.painteventargs" />。</param>
151         protected override void onpaint(painteventargs e)
152         {
153             base.onpaint(e);
154             var g = e.graphics;
155             g.setgdihigh();
156             graphicspath pathlinein = new graphicspath();
157             graphicspath pathlineout = new graphicspath();
158             int intlinepenwidth = 0;
159 
160             switch (exitdirection)
161             {
162                 case blowerexitdirection.left:
163                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(0, m_rectworking.top, this.width / 2, m_rectworking.height / 2 - 5));
164                     intlinepenwidth = m_rectworking.height / 2 - 5;
165                     pathlineout.addline(new point(-10, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2));
166                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(1, m_rectworking.top - 2), new point(1, m_rectworking.top + (m_rectworking.height / 2 - 5) + 2));
167                     break;
168                 case blowerexitdirection.right:
169                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(this.width / 2, m_rectworking.top, this.width / 2, m_rectworking.height / 2 - 5));
170                     intlinepenwidth = m_rectworking.height / 2 - 5;
171                     pathlineout.addline(new point(this.width + 10, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.top + (m_rectworking.height / 2 - 5) / 2));
172                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(this.width - 2, m_rectworking.top - 2), new point(this.width - 2, m_rectworking.top + (m_rectworking.height / 2 - 5) + 2));
173                     break;
174                 case blowerexitdirection.up:
175                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(m_rectworking.right - (m_rectworking.width / 2 - 5), 0, m_rectworking.width / 2 - 5, this.height / 2));
176                     intlinepenwidth = m_rectworking.width / 2 - 5;
177                     pathlineout.addline(new point(m_rectworking.right - (m_rectworking.width / 2 - 5) / 2, -10), new point(m_rectworking.right - (m_rectworking.width / 2 - 5) / 2, m_rectworking.top + m_rectworking.height / 2));
178                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.right + 2, 1), new point(m_rectworking.right - (m_rectworking.width / 2 - 5) - 2, 1));
179                     break;
180             }
181 
182             switch (entrancedirection)
183             {
184                 case blowerentrancedirection.left:
185                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(0, m_rectworking.bottom - m_rectworking.height / 2 + 5, this.width / 2, m_rectworking.height / 2 - 5));
186                     pathlinein.addline(new point(-10, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2));
187                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(1, m_rectworking.bottom - m_rectworking.height / 2 + 5 - 2), new point(1, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) + 2));
188                     break;
189                 case blowerentrancedirection.right:
190                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(this.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5, this.width / 2, m_rectworking.height / 2 - 5));
191                     pathlinein.addline(new point(this.width + 10, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2), new point(m_rectworking.left + m_rectworking.width / 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) / 2));
192                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(this.width - 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 - 2), new point(this.width - 2, m_rectworking.bottom - m_rectworking.height / 2 + 5 + (m_rectworking.height / 2 - 5) + 2));
193                     break;
194                 case blowerentrancedirection.up:
195                     g.fillrectangle(new solidbrush(blowercolor), new rectangle(m_rectworking.left, 0, m_rectworking.width / 2 - 5, this.height / 2));
196                     pathlinein.addline(new point(m_rectworking.left + (m_rectworking.width / 2 - 5) / 2, -10), new point(m_rectworking.left + (m_rectworking.width / 2 - 5) / 2, m_rectworking.top + m_rectworking.height / 2));
197                     g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.left - 2, 1), new point(m_rectworking.left + (m_rectworking.width / 2 - 5) + 2, 1));
198                     break;
199             }
200 
201             //渐变色
202             int _intpenwidth = intlinepenwidth;
203             int intcount = _intpenwidth / 2 / 4;
204             for (int i = 0; i < intcount; i++)
205             {
206                 int _penwidth = _intpenwidth / 2 - 4 * i;
207                 if (_penwidth <= 0)
208                     _penwidth = 1;
209                 if (entrancedirection != blowerentrancedirection.none)
210                     g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), pathlinein);
211                 g.drawpath(new pen(new solidbrush(color.fromargb(40, color.white.r, color.white.g, color.white.b)), _penwidth), pathlineout);
212                 if (_penwidth == 1)
213                     break;
214             }
215 
216             //底座
217             graphicspath gpdz = new graphicspath();
218             gpdz.addlines(new point[] 
219             {
220                 new point( m_rectworking.left+m_rectworking.width/2,m_rectworking.top+m_rectworking.height/2),
221                 new point(m_rectworking.left+2,this.height),
222                 new point(m_rectworking.right-2,this.height)
223             });
224             gpdz.closeallfigures();
225             g.fillpath(new solidbrush(blowercolor), gpdz);
226             g.fillpath(new solidbrush(color.fromargb(50, color.white)), gpdz);
227             g.drawline(new pen(new solidbrush(blowercolor), 3), new point(m_rectworking.left, this.height - 2), new point(m_rectworking.right, this.height - 2));
228 
229             //中心
230             g.fillellipse(new solidbrush(blowercolor), m_rectworking);
231             g.fillellipse(new solidbrush(color.fromargb(20, color.white)), m_rectworking);
232 
233 
234             //扇叶
235             rectangle _rect = new rectangle(m_rectworking.left + (m_rectworking.width - (m_rectworking.width / 3 * 2)) / 2, m_rectworking.top + (m_rectworking.height - (m_rectworking.width / 3 * 2)) / 2, (m_rectworking.width / 3 * 2), (m_rectworking.width / 3 * 2));
236 
237             int _splitcount = 8;
238             float fltsplitvalue = 360f / (float)_splitcount;
239             for (int i = 0; i <= _splitcount; i++)
240             {
241                 float fltangle = (fltsplitvalue * i - 180) % 360;
242                 float flty1 = (float)(_rect.top + _rect.width / 2 - ((_rect.width / 2) * math.sin(math.pi * (fltangle / 180.00f))));
243                 float fltx1 = (float)(_rect.left + (_rect.width / 2 - ((_rect.width / 2) * math.cos(math.pi * (fltangle / 180.00f)))));
244                 float flty2 = 0;
245                 float fltx2 = 0;
246 
247                 flty2 = (float)(_rect.top + _rect.width / 2 - ((_rect.width / 4) * math.sin(math.pi * (fltangle / 180.00f))));
248                 fltx2 = (float)(_rect.left + (_rect.width / 2 - ((_rect.width / 4) * math.cos(math.pi * (fltangle / 180.00f)))));
249 
250                 g.drawline(new pen(new solidbrush(fancolor), 2), new pointf(fltx1, flty1), new pointf(fltx2, flty2));
251             }
252 
253             g.fillellipse(new solidbrush(fancolor), new rectangle(_rect.left + _rect.width / 2 - _rect.width / 4 + 2, _rect.top + _rect.width / 2 - _rect.width / 4 + 2, _rect.width / 2 - 4, _rect.width / 2 - 4));
254             g.fillellipse(new solidbrush(color.fromargb(50, color.white)), new rectangle(_rect.left - 5, _rect.top - 5, _rect.width + 10, _rect.height + 10));
255         }
256     }
257     /// <summary>
258     /// enum blowerentrancedirection
259     /// </summary>
260     public enum blowerentrancedirection
261     {
262         /// <summary>
263         /// the none
264         /// </summary>
265         none,
266         /// <summary>
267         /// the left
268         /// </summary>
269         left,
270         /// <summary>
271         /// the right
272         /// </summary>
273         right,
274         /// <summary>
275         /// up
276         /// </summary>
277         up
278     }
279 
280     /// <summary>
281     /// enum blowerexitdirection
282     /// </summary>
283     public enum blowerexitdirection
284     {
285         /// <summary>
286         /// the left
287         /// </summary>
288         left,
289         /// <summary>
290         /// the right
291         /// </summary>
292         right,
293         /// <summary>
294         /// up
295         /// </summary>
296         up
297     }
298 }

 

添加一个类ucblower ,继承usercontrol

最后的话

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