我正在尝试扩展 System.Windows.Forms.Label 类以支持垂直绘制的文本。为此,我创建了一个名为 MyLabelOrientation 的新属性,用户可以将其设置为水平或垂直。当用户更改此设置时,将交换宽度和高度的值,以将控件的大小调整为新的方向。最后,我重写了 OnPaint 函数来绘制我的标签。
我还想扩展此控件的 AutoSize 属性,以便我的标签将自动调整大小为它包含的文本。对于水平方向,基本功能为我实现了这一点。对于垂直方向,我创建了一个 Graphics 对象并将控件的高度设置为从 Graphics.MeasureString(Text, Font) 返回的 SizeF 对象的宽度。您可以在下面看到我正在使用的代码示例。
using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel.Design;
using System.Windows.Forms.Design;
public class MyLabel : Label
{
public enum MyLabelOrientation {Horizontal, Vertical};
protected MyLabelOrientation m_orientation = MyLabelOrientation.Horizontal;
[Category("Appearance")]
public virtual MyLabelOrientation Orientation
{
get { return m_orientation; }
set
{
m_orientation = value;
int temp = Height;
Width = Height;
Height = temp;
Refresh();
}
}
private Size ResizeLabel()
{
Graphics g = Graphics.FromHwnd(this.Handle);
SizeF newSize = g.MeasureString(Text, Font);
if (m_orientation == MyLabelOrientation.Horizontal)
Width = (int)newSize.Width;
else
Height = (int)newSize.Width;
}
protected override void OnPaint(PaintEventArgs e)
{
Brush textBrush = new SolidBrush(this.ForeColor);
if (m_orientation == LabelOrientation.Vertical)
{
e.Graphics.TranslateTransform(Width, 0);
e.Graphics.RotateTransform(90);
e.Graphics.DrawString(Text, Font, textBrush, Padding.Left, Padding.Top);
}
else
{
base.OnPaint(e);
}
}
}
但是,将 AutoSize 设置为 true 似乎可以防止和/或覆盖对控件大小的任何更改。这意味着当我想更改标签的方向时,我无法更改宽度或高度。我想知道是否可以覆盖此行为,以便我可以测试是否设置了 AutoSize,然后根据控件的方向调整控件的大小。