我有一个自定义Label类,绘制的文本不适合。 我在这里做错了什么?
class MyLabel: Label
{
public MyLabel()
{
SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
}
protected override void OnPaint(PaintEventArgs e)
{
using (LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, Color.Black, Color.LightGray, LinearGradientMode.ForwardDiagonal))
e.Graphics.DrawString(Text, Font, brush, ClientRectangle);
}
}
如果我将MyLabel的文本设置为“123456790 123456790”( AutoSize = true ),那么我在Designer(或运行时)中看到“1234567890 123456789”(没有最后的零,但是一些空间)。如果我尝试“1234567890 1234567890 1234567890 1234567890”,那么将会出现“1234567890 1234567890 1234567890 12345678”(没有“90”,但是还有一些空格)。
答案 0 :(得分:2)
e.Graphics.DrawString(Text, Font, brush, ClientRectangle);
您使用的是错误的文字渲染方法。 Label类根据TextRenderer.MeasureText()的返回值自行调整自身大小。因此,您必须使用TextRenderer.DrawText()来获得完全相同的渲染输出。您还可以将标签的UseCompatibleTextRendering属性设置为true,但这不应该是您的首选。
答案 1 :(得分:0)
使用Graphics.MeasureString获取所需的边界框大小,然后将标签表面的大小设置为该大小。
答案 2 :(得分:0)
这里提出了一个解决方案(可能不是最好的解决方案),可以将其改为“带有Graditent文本颜色的自动标签”。
class MyLabel: Label
{
private bool _autoSize = true;
/// <summary>
/// Get or set auto size
/// </summary>
public new bool AutoSize
{
get { return _autoSize; }
set
{
_autoSize = value;
Invalidate();
}
}
public MyLabel()
{
SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
base.AutoSize = false;
}
protected override void OnPaint(PaintEventArgs e)
{
// auto size
if (_autoSize)
{
SizeF size = e.Graphics.MeasureString(Text, Font);
if (ClientSize.Width < (int)size.Width + 1 || ClientSize.Width > (int)size.Width + 1 ||
ClientSize.Height < (int)size.Height + 1 || ClientSize.Height > (int)size.Height + 1)
{
// need resizing
ClientSize = new Size((int)size.Width + 1, (int)size.Height + 1);
return;
}
}
using (LinearGradientBrush brush = new LinearGradientBrush(ClientRectangle, Color.Black, Color.LightGray, LinearGradientMode.ForwardDiagonal))
e.Graphics.DrawString(Text, Font, brush, ClientRectangle);
}
}
背后的想法非常简单:覆盖AutoSize并在Paint事件中处理它(一切都在一个地方),如果所需的文本大小与ClientSize不同 - 调整大小控制(这将导致重绘)。有一件事就是你需要在宽度和高度上添加+1,因为SizeF有分数,最好有+1像素,而不是松散1像素,并且你的文字不合适。