我正在尝试扩展System.Windows.Forms.Label类以支持垂直绘制的文本。我这样做是通过创建一个名为MyLabelOrientation的新属性,用户可以将其设置为Horizontal或Vertical。当用户更改此设置时,将交换宽度和高度的值以将控件的大小调整为其新方向。最后,我重写OnPaint函数来绘制我的标签。
我想扩展此控件的AutoSize属性,以便我的Label会自动调整其包含的文本大小。对于水平方向,基本功能为我实现了这一点。对于垂直方向,创建一个图形对象,并设置控制向的SizeF对象的宽度的高度从Graphics.MeasureString(文字,字体)返回。您可以在下面看到我正在使用的代码示例。
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似乎可以防止和/或覆盖对控件大小的任何更改。这意味着当我想要更改Label的方向时,我无法更改宽度或高度。我想知道如果这种行为可以被覆盖,这样我可以测试的AutoSize是否被设置,然后根据它的取向调整控制的大小。
答案 0 :(得分:1)
我之前没有这样做,我相信你理论上可以覆盖属性声明(通过new
关键字)并在继续之前检查方向:
override public bool AutoSize
{
set
{
if( /* orientation is horizontal */ )
{
base.AutoSize = value;
}
else
{
// do what you need to do
}
}
}
答案 1 :(得分:0)
如果认为解决方案是覆盖OnResize
本身:
protected override void OnResize(EventArgs e)
{
if (AutoSize)
{
// Perform your own resizing logic
}
else
OnResize(e);
}
答案 2 :(得分:0)
我知道这是一个非常老的问题,但是我今天偶然发现了这个问题,想知道如何做同样的事情。
我对这个问题的解决方案是重写GetPreferredSize(Size proposedSize)
方法。我使用的按钮类除了包含文本(当然,使用AutoSize属性未将其考虑在内)之外还包含箭头,因此我添加了额外的空间,对我来说很好用。
鉴于更改方向或切换宽度和高度的问题,您可以完全更改首选尺寸的计算方式。
public override Size GetPreferredSize(Size proposedSize)
{
Size s = base.GetPreferredSize(proposedSize);
if (AutoSize)
{
s.Width += 15;
}
return s;
}