(六十三)c#Winform自定义控件-箭头(工业)

前提

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

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

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

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

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

NuGet

Install-Package HZH_Controls

目录

https://www.cnblogs.com/bfyx/p/11364884.html

用处及效果

(六十三)c#Winform自定义控件-箭头(工业)_第1张图片

准备工作

依然用GDI+,请自行百度了解

开始

添加一个类UCArrow,继承UserControl

添加枚举,控制方向

 1 /// 
 2     /// Enum ArrowDirection
 3     /// 
 4     public enum ArrowDirection
 5     {
 6         /// 
 7         /// The left
 8         /// 
 9         Left,
10         /// 
11         /// The right
12         /// 
13         Right,
14         /// 
15         /// The top
16         /// 
17         Top,
18         /// 
19         /// The bottom
20         /// 
21         Bottom,
22         /// 
23         /// The left right
24         /// 
25         Left_Right,
26         /// 
27         /// The top bottom
28         /// 
29         Top_Bottom
30     }

一些属性

  1  /// 
  2         /// The arrow color
  3         /// 
  4         private Color arrowColor = Color.FromArgb(255, 77, 59);
  5 
  6         /// 
  7         /// Gets or sets the color of the arrow.
  8         /// 
  9         /// The color of the arrow.
 10         [Description("箭头颜色"), Category("自定义")]
 11         public Color ArrowColor
 12         {
 13             get { return arrowColor; }
 14             set
 15             {
 16                 arrowColor = value;
 17                 Refresh();
 18             }
 19         }
 20 
 21         /// 
 22         /// The border color
 23         /// 
 24         private Color? borderColor = null;
 25 
 26         /// 
 27         /// Gets or sets the color of the border.
 28         /// 
 29         /// The color of the border.
 30         [Description("箭头边框颜色,为空则无边框"), Category("自定义")]
 31         public Color? BorderColor
 32         {
 33             get { return borderColor; }
 34             set
 35             {
 36                 borderColor = value;
 37                 Refresh();
 38             }
 39         }
 40 
 41         /// 
 42         /// The direction
 43         /// 
 44         private ArrowDirection direction = ArrowDirection.Right;
 45 
 46         /// 
 47         /// Gets or sets the direction.
 48         /// 
 49         /// The direction.
 50         [Description("箭头方向"), Category("自定义")]
 51         public ArrowDirection Direction
 52         {
 53             get { return direction; }
 54             set
 55             {
 56                 direction = value;
 57                 ResetPath();
 58                 Refresh();
 59             }
 60         }
 61         /// 
 62         /// 获取或设置控件显示的文字的字体。
 63         /// 
 64         /// The font.
 65         /// 
 66         ///   
 67         ///   
 68         ///   
 69         ///   
 70         /// 
 71         public override Font Font
 72         {
 73             get
 74             {
 75                 return base.Font;
 76             }
 77             set
 78             {
 79                 base.Font = value;
 80                 Refresh();
 81             }
 82         }
 83         /// 
 84         /// 获取或设置控件的前景色。
 85         /// 
 86         /// The color of the fore.
 87         /// 
 88         ///   
 89         /// 
 90         public override Color ForeColor
 91         {
 92             get
 93             {
 94                 return base.ForeColor;
 95             }
 96             set
 97             {
 98                 base.ForeColor = value;
 99                 Refresh();
100             }
101         }
102         /// 
103         /// The text
104         /// 
105         private string text;
106         /// 
107         /// Gets or sets the text.
108         /// 
109         /// The text.
110         [Bindable(true)]
111         [Browsable(true)]
112         [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
113         [EditorBrowsable(EditorBrowsableState.Always)]
114         [Localizable(true)]
115         [Description("箭头文字"), Category("自定义")]
116         public override string Text
117         {
118             get
119             {
120                 return text;
121             }
122             set
123             {
124                 text = value;
125                 Refresh();
126             }
127         }
128         /// 
129         /// The m path
130         /// 
131         GraphicsPath m_path;

根据方向和大小设置path

 1   private void ResetPath()
 2         {
 3             Point[] ps = null;
 4             switch (direction)
 5             {
 6                 case ArrowDirection.Left:
 7                     ps = new Point[] 
 8                     { 
 9                         new Point(0,this.Height/2),
10                         new Point(40,0),
11                         new Point(40,this.Height/4),
12                         new Point(this.Width-1,this.Height/4),
13                         new Point(this.Width-1,this.Height-this.Height/4),
14                         new Point(40,this.Height-this.Height/4),
15                         new Point(40,this.Height),
16                         new Point(0,this.Height/2)
17                     };
18                     break;
19                 case ArrowDirection.Right:
20                     ps = new Point[] 
21                     {
22                         new Point(0,this.Height/4),
23                         new Point(this.Width-40,this.Height/4),
24                         new Point(this.Width-40,0),
25                         new Point(this.Width-1,this.Height/2),
26                         new Point(this.Width-40,this.Height),
27                         new Point(this.Width-40,this.Height-this.Height/4),                      
28                         new Point(0,this.Height-this.Height/4),
29                         new Point(0,this.Height/4)
30                     };
31                     break;
32                 case ArrowDirection.Top:
33                     ps = new Point[] 
34                     {
35                        new Point(this.Width/2,0),
36                        new Point(this.Width,40),
37                        new Point(this.Width-this.Width/4,40),
38                        new Point(this.Width-this.Width/4,this.Height-1),
39                        new Point(this.Width/4,this.Height-1),
40                        new Point(this.Width/4,40),
41                        new Point(0,40),
42                        new Point(this.Width/2,0),
43                     };
44                     break;
45                 case ArrowDirection.Bottom:
46                     ps = new Point[] 
47                     {
48                        new Point(this.Width-this.Width/4,0),
49                        new Point(this.Width-this.Width/4,this.Height-40),
50                        new Point(this.Width,this.Height-40),
51                        new Point(this.Width/2,this.Height-1),
52                        new Point(0,this.Height-40),
53                        new Point(this.Width/4,this.Height-40),
54                        new Point(this.Width/4,0),
55                        new Point(this.Width-this.Width/4,0),                      
56                     };
57                     break;
58                 case ArrowDirection.Left_Right:
59                     ps = new Point[] 
60                     { 
61                         new Point(0,this.Height/2),
62                         new Point(40,0),
63                         new Point(40,this.Height/4),
64                         new Point(this.Width-40,this.Height/4),
65                         new Point(this.Width-40,0),
66                         new Point(this.Width-1,this.Height/2),
67                         new Point(this.Width-40,this.Height),
68                         new Point(this.Width-40,this.Height-this.Height/4),
69                         new Point(40,this.Height-this.Height/4),
70                         new Point(40,this.Height),
71                         new Point(0,this.Height/2),                       
72                     };
73                     break;
74                 case ArrowDirection.Top_Bottom:
75                     ps = new Point[] 
76                     {
77                        new Point(this.Width/2,0),
78                        new Point(this.Width,40),
79                        new Point(this.Width-this.Width/4,40),
80                        new Point(this.Width-this.Width/4,this.Height-40),
81                        new Point(this.Width,this.Height-40),
82                        new Point(this.Width/2,this.Height-1),
83                        new Point(0,this.Height-40),
84                        new Point(this.Width/4,this.Height-40),
85                        new Point(this.Width/4,40),
86                        new Point(0,40),
87                        new Point(this.Width/2,0),                      
88                     };
89                     break;
90             }
91             m_path = new GraphicsPath();
92             m_path.AddLines(ps);
93             m_path.CloseAllFigures();
94         }

重绘

 1   protected override void OnPaint(PaintEventArgs e)
 2         {
 3             base.OnPaint(e);
 4             var g = e.Graphics;
 5             g.SetGDIHigh();
 6 
 7             g.FillPath(new SolidBrush(arrowColor), m_path);
 8 
 9             if (borderColor != null && borderColor != Color.Empty)
10                 g.DrawPath(new Pen(new SolidBrush(borderColor.Value)), m_path);
11             if (!string.IsNullOrEmpty(text))
12             {
13                 var size = g.MeasureString(Text, Font);
14                 g.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF((this.Width - size.Width) / 2, (this.Height - size.Height) / 2));
15             }
16         }

完整代码

  1 // ***********************************************************************
  2 // Assembly         : HZH_Controls
  3 // Created          : 2019-09-10
  4 //
  5 // ***********************************************************************
  6 // 
  7 //     Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:[email protected]
  8 // 
  9 //
 10 // Blog: https://www.cnblogs.com/bfyx
 11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl
 12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
 13 //
 14 // If you use this code, please keep this note.
 15 // ***********************************************************************
 16 using System;
 17 using System.Collections.Generic;
 18 using System.Linq;
 19 using System.Text;
 20 using System.Windows.Forms;
 21 using System.Drawing;
 22 using System.Drawing.Drawing2D;
 23 using System.ComponentModel;
 24 
 25 namespace HZH_Controls.Controls
 26 {
 27     /// 
 28     /// Class UCArrow.
 29     /// Implements the 
 30     /// 
 31     /// 
 32     public class UCArrow : UserControl
 33     {
 34         /// 
 35         /// The arrow color
 36         /// 
 37         private Color arrowColor = Color.FromArgb(255, 77, 59);
 38 
 39         /// 
 40         /// Gets or sets the color of the arrow.
 41         /// 
 42         /// The color of the arrow.
 43         [Description("箭头颜色"), Category("自定义")]
 44         public Color ArrowColor
 45         {
 46             get { return arrowColor; }
 47             set
 48             {
 49                 arrowColor = value;
 50                 Refresh();
 51             }
 52         }
 53 
 54         /// 
 55         /// The border color
 56         /// 
 57         private Color? borderColor = null;
 58 
 59         /// 
 60         /// Gets or sets the color of the border.
 61         /// 
 62         /// The color of the border.
 63         [Description("箭头边框颜色,为空则无边框"), Category("自定义")]
 64         public Color? BorderColor
 65         {
 66             get { return borderColor; }
 67             set
 68             {
 69                 borderColor = value;
 70                 Refresh();
 71             }
 72         }
 73 
 74         /// 
 75         /// The direction
 76         /// 
 77         private ArrowDirection direction = ArrowDirection.Right;
 78 
 79         /// 
 80         /// Gets or sets the direction.
 81         /// 
 82         /// The direction.
 83         [Description("箭头方向"), Category("自定义")]
 84         public ArrowDirection Direction
 85         {
 86             get { return direction; }
 87             set
 88             {
 89                 direction = value;
 90                 ResetPath();
 91                 Refresh();
 92             }
 93         }
 94         /// 
 95         /// 获取或设置控件显示的文字的字体。
 96         /// 
 97         /// The font.
 98         /// 
 99         ///   
100         ///   
101         ///   
102         ///   
103         /// 
104         public override Font Font
105         {
106             get
107             {
108                 return base.Font;
109             }
110             set
111             {
112                 base.Font = value;
113                 Refresh();
114             }
115         }
116         /// 
117         /// 获取或设置控件的前景色。
118         /// 
119         /// The color of the fore.
120         /// 
121         ///   
122         /// 
123         public override Color ForeColor
124         {
125             get
126             {
127                 return base.ForeColor;
128             }
129             set
130             {
131                 base.ForeColor = value;
132                 Refresh();
133             }
134         }
135         /// 
136         /// The text
137         /// 
138         private string text;
139         /// 
140         /// Gets or sets the text.
141         /// 
142         /// The text.
143         [Bindable(true)]
144         [Browsable(true)]
145         [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
146         [EditorBrowsable(EditorBrowsableState.Always)]
147         [Localizable(true)]
148         [Description("箭头文字"), Category("自定义")]
149         public override string Text
150         {
151             get
152             {
153                 return text;
154             }
155             set
156             {
157                 text = value;
158                 Refresh();
159             }
160         }
161         /// 
162         /// The m path
163         /// 
164         GraphicsPath m_path;
165         /// 
166         /// Initializes a new instance of the  class.
167         /// 
168         public UCArrow()
169         {
170             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
171             this.SetStyle(ControlStyles.DoubleBuffer, true);
172             this.SetStyle(ControlStyles.ResizeRedraw, true);
173             this.SetStyle(ControlStyles.Selectable, true);
174             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
175             this.SetStyle(ControlStyles.UserPaint, true);
176             this.ForeColor = Color.White;
177             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
178             this.SizeChanged += UCArrow_SizeChanged;
179             this.Size = new Size(100, 50);
180         }
181 
182         /// 
183         /// Handles the SizeChanged event of the UCArrow control.
184         /// 
185         /// The source of the event.
186         /// The  instance containing the event data.
187         void UCArrow_SizeChanged(object sender, EventArgs e)
188         {
189             ResetPath();
190         }
191 
192         /// 
193         /// Resets the path.
194         /// 
195         private void ResetPath()
196         {
197             Point[] ps = null;
198             switch (direction)
199             {
200                 case ArrowDirection.Left:
201                     ps = new Point[] 
202                     { 
203                         new Point(0,this.Height/2),
204                         new Point(40,0),
205                         new Point(40,this.Height/4),
206                         new Point(this.Width-1,this.Height/4),
207                         new Point(this.Width-1,this.Height-this.Height/4),
208                         new Point(40,this.Height-this.Height/4),
209                         new Point(40,this.Height),
210                         new Point(0,this.Height/2)
211                     };
212                     break;
213                 case ArrowDirection.Right:
214                     ps = new Point[] 
215                     {
216                         new Point(0,this.Height/4),
217                         new Point(this.Width-40,this.Height/4),
218                         new Point(this.Width-40,0),
219                         new Point(this.Width-1,this.Height/2),
220                         new Point(this.Width-40,this.Height),
221                         new Point(this.Width-40,this.Height-this.Height/4),                      
222                         new Point(0,this.Height-this.Height/4),
223                         new Point(0,this.Height/4)
224                     };
225                     break;
226                 case ArrowDirection.Top:
227                     ps = new Point[] 
228                     {
229                        new Point(this.Width/2,0),
230                        new Point(this.Width,40),
231                        new Point(this.Width-this.Width/4,40),
232                        new Point(this.Width-this.Width/4,this.Height-1),
233                        new Point(this.Width/4,this.Height-1),
234                        new Point(this.Width/4,40),
235                        new Point(0,40),
236                        new Point(this.Width/2,0),
237                     };
238                     break;
239                 case ArrowDirection.Bottom:
240                     ps = new Point[] 
241                     {
242                        new Point(this.Width-this.Width/4,0),
243                        new Point(this.Width-this.Width/4,this.Height-40),
244                        new Point(this.Width,this.Height-40),
245                        new Point(this.Width/2,this.Height-1),
246                        new Point(0,this.Height-40),
247                        new Point(this.Width/4,this.Height-40),
248                        new Point(this.Width/4,0),
249                        new Point(this.Width-this.Width/4,0),                      
250                     };
251                     break;
252                 case ArrowDirection.Left_Right:
253                     ps = new Point[] 
254                     { 
255                         new Point(0,this.Height/2),
256                         new Point(40,0),
257                         new Point(40,this.Height/4),
258                         new Point(this.Width-40,this.Height/4),
259                         new Point(this.Width-40,0),
260                         new Point(this.Width-1,this.Height/2),
261                         new Point(this.Width-40,this.Height),
262                         new Point(this.Width-40,this.Height-this.Height/4),
263                         new Point(40,this.Height-this.Height/4),
264                         new Point(40,this.Height),
265                         new Point(0,this.Height/2),                       
266                     };
267                     break;
268                 case ArrowDirection.Top_Bottom:
269                     ps = new Point[] 
270                     {
271                        new Point(this.Width/2,0),
272                        new Point(this.Width,40),
273                        new Point(this.Width-this.Width/4,40),
274                        new Point(this.Width-this.Width/4,this.Height-40),
275                        new Point(this.Width,this.Height-40),
276                        new Point(this.Width/2,this.Height-1),
277                        new Point(0,this.Height-40),
278                        new Point(this.Width/4,this.Height-40),
279                        new Point(this.Width/4,40),
280                        new Point(0,40),
281                        new Point(this.Width/2,0),                      
282                     };
283                     break;
284             }
285             m_path = new GraphicsPath();
286             m_path.AddLines(ps);
287             m_path.CloseAllFigures();
288         }
289 
290         /// 
291         /// 引发  事件。
292         /// 
293         /// 包含事件数据的 
294         protected override void OnPaint(PaintEventArgs e)
295         {
296             base.OnPaint(e);
297             var g = e.Graphics;
298             g.SetGDIHigh();
299 
300             g.FillPath(new SolidBrush(arrowColor), m_path);
301 
302             if (borderColor != null && borderColor != Color.Empty)
303                 g.DrawPath(new Pen(new SolidBrush(borderColor.Value)), m_path);
304             if (!string.IsNullOrEmpty(text))
305             {
306                 var size = g.MeasureString(Text, Font);
307                 g.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF((this.Width - size.Width) / 2, (this.Height - size.Height) / 2));
308             }
309         }
310     }
311 
312     /// 
313     /// Enum ArrowDirection
314     /// 
315     public enum ArrowDirection
316     {
317         /// 
318         /// The left
319         /// 
320         Left,
321         /// 
322         /// The right
323         /// 
324         Right,
325         /// 
326         /// The top
327         /// 
328         Top,
329         /// 
330         /// The bottom
331         /// 
332         Bottom,
333         /// 
334         /// The left right
335         /// 
336         Left_Right,
337         /// 
338         /// The top bottom
339         /// 
340         Top_Bottom
341     }
342 }
View Code

 

最后的话

如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

你可能感兴趣的:((六十三)c#Winform自定义控件-箭头(工业))