入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。
GitHub:https://github.com/kwwwvagaa/NetWinformControl
码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
Install-Package HZH_Controls
https://www.cnblogs.com/bfyx/p/11364884.html
这个比较简单,对label扩展,重绘划线即可
添加一个类UCSplitLabel ,继承 Label
代码比较少
1 // ***********************************************************************
2 // Assembly : HZH_Controls
3 // Created : 2019-10-09
4 //
5 // ***********************************************************************
6 // <copyright file="UCSplitLabel.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.ComponentModel;
23
24 namespace HZH_Controls.Controls
25 {
26 /// <summary>
27 /// Class UCSplitLabel.
28 /// Implements the <see cref="System.Windows.Forms.Label" />
29 /// </summary>
30 /// <seealso cref="System.Windows.Forms.Label" />
31 public class UCSplitLabel : Label
32 {
33 /// <summary>
34 /// Gets or sets the text.
35 /// </summary>
36 /// <value>The text.</value>
37 [Localizable(true)]
38 public override string Text
39 {
40 get
41 {
42 return base.Text;
43 }
44 set
45 {
46 base.Text = value;
47 ResetMaxSize();
48 }
49 }
50 /// <summary>
51 /// 获取或设置控件显示的文字的字体。
52 /// </summary>
53 /// <value>The font.</value>
54 /// <PermissionSet>
55 /// <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
56 /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
57 /// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence" />
58 /// <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
59 /// </PermissionSet>
60 [Localizable(true)]
61 public override Font Font
62 {
63 get
64 {
65 return base.Font;
66 }
67 set
68 {
69 base.Font = value;
70 ResetMaxSize();
71 }
72 }
73 /// <summary>
74 /// 获取或设置大小,该大小是 <see cref="M:System.Windows.Forms.Control.GetPreferredSize(System.Drawing.Size)" /> 可以指定的下限。
75 /// </summary>
76 /// <value>The minimum size.</value>
77 [Localizable(true)]
78 public override Size MinimumSize
79 {
80 get
81 {
82 return base.MinimumSize;
83 }
84 set
85 {
86 base.MinimumSize = value;
87 ResetMaxSize();
88 }
89 }
90
91
92 /// <summary>
93 /// 获取或设置大小,该大小是 <see cref="M:System.Windows.Forms.Control.GetPreferredSize(System.Drawing.Size)" /> 可以指定的上限。
94 /// </summary>
95 /// <value>The maximum size.</value>
96 [Localizable(true)]
97 public override Size MaximumSize
98 {
99 get
100 {
101 return base.MaximumSize;
102 }
103 set
104 {
105 base.MaximumSize = value;
106 ResetMaxSize();
107 }
108 }
109 /// <summary>
110 /// 获取或设置一个值,该值指示是否自动调整控件的大小以完整显示其内容。
111 /// </summary>
112 /// <value><c>true</c> if [automatic size]; otherwise, <c>false</c>.</value>
113 /// <PermissionSet>
114 /// <IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
115 /// <IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
116 /// <IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Flags="UnmanagedCode, ControlEvidence" />
117 /// <IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true" />
118 /// </PermissionSet>
119 [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
120 public override bool AutoSize
121 {
122 get
123 {
124 return base.AutoSize;
125 }
126 set
127 {
128 base.AutoSize = value;
129 }
130 }
131
132
133 /// <summary>
134 /// The line color
135 /// </summary>
136 private Color lineColor = LineColors.Light;
137
138 /// <summary>
139 /// Gets or sets the color of the line.
140 /// </summary>
141 /// <value>The color of the line.</value>
142 public Color LineColor
143 {
144 get { return lineColor; }
145 set
146 {
147 lineColor = value;
148 Invalidate();
149 }
150 }
151
152 /// <summary>
153 /// Resets the maximum size.
154 /// </summary>
155 private void ResetMaxSize()
156 {
157 using (var g = this.CreateGraphics())
158 {
159 var _width = Width;
160 var size = g.MeasureString(string.IsNullOrEmpty(Text) ? "A" : Text, Font);
161 if (MinimumSize.Height != (int)size.Height)
162 MinimumSize = new Size(base.MinimumSize.Width, (int)size.Height);
163 if (MaximumSize.Height != (int)size.Height)
164 MaximumSize = new Size(base.MaximumSize.Width, (int)size.Height);
165 this.Width = _width;
166 }
167 }
168 /// <summary>
169 /// Initializes a new instance of the <see cref="UCSplitLabel"/> class.
170 /// </summary>
171 public UCSplitLabel()
172 : base()
173 {
174 if (ControlHelper.IsDesignMode())
175 {
176 Text = "分割线";
177 Font = new Font("微软雅黑", 8f);
178 }
179 this.AutoSize = false;
180 Padding = new Padding(20, 0, 0, 0);
181 MinimumSize = new System.Drawing.Size(150, 10);
182 PaddingChanged += UCSplitLabel_PaddingChanged;
183 this.Width = 200;
184 }
185
186 /// <summary>
187 /// Handles the PaddingChanged event of the UCSplitLabel control.
188 /// </summary>
189 /// <param name="sender">The source of the event.</param>
190 /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
191 void UCSplitLabel_PaddingChanged(object sender, EventArgs e)
192 {
193 if (Padding.Left < 20)
194 {
195 Padding = new Padding(20, Padding.Top, Padding.Right, Padding.Bottom);
196 }
197 }
198
199 /// <summary>
200 /// Handles the <see cref="E:Paint" /> event.
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 var g = e.Graphics;
207 g.SetGDIHigh();
208
209 var size = g.MeasureString(Text, Font);
210 g.DrawLine(new Pen(new SolidBrush(lineColor)), new PointF(1, Padding.Top + (this.Height - Padding.Top - Padding.Bottom) / 2), new PointF(Padding.Left - 2, Padding.Top + (this.Height - Padding.Top - Padding.Bottom) / 2));
211 g.DrawLine(new Pen(new SolidBrush(lineColor)), new PointF(Padding.Left + size.Width + 1, Padding.Top + (this.Height - Padding.Top - Padding.Bottom) / 2), new PointF(Width - Padding.Right, Padding.Top + (this.Height - Padding.Top - Padding.Bottom) / 2));
212
213 }
214 }
215 }