标签UserPaint绘制文本不适合(Label UserPaint drawn text does

2019-11-01 16:51发布

我有一个自定义标签类,绘制文本不适合。 我在做什么错在这里?

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”( 自动调整大小=真 ),然后我看到设计师(或在运行时)“1234567890 123456789”(没有最后为零,但一些空间)。 如果我尝试 “1234567890 1234567890 1234567890 1234567890”,这时会出现 “1234567890 1234567890 1234567890 12345678”(没有 “90后”,但同样的空间)。

Answer 1:

e.Graphics.DrawString(Text, Font, brush, ClientRectangle);

您使用了错误的文字渲染方法。 基于TextRenderer.MeasureText的返回值的标签类自动调整大小本身()。 因此,您必须使用TextRenderer.DrawText()来获取完全相同的渲染输出。 您还可以在标签的UseCompatibleTextRendering属性设置为true,但不应该是你的第一选择。



Answer 2:

使用Graphics.MeasureString得到边框的所需的大小,然后设置标签的表面的大小是大小。



Answer 3:

在这里不用的溶液(可能不是最好的)到可以改述为“自动调整大小的标签与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);
    }
}

背后的思想很简单:覆盖自动调整大小和Paint事件(一切都在一个地方)内对其进行处理,如果文本的要求尺寸是ClientSize不同 - 调整控制(这将导致重绘)。 有一件事是你必须添加+1宽度和高度,因为拥有的SizeF分数,并最好有+1像素,而非宽松的1个像素以上,有时,有你的文字无法适应。



文章来源: Label UserPaint drawn text doesn't fit