C#标签TextAlign在OnPaint覆盖后不起作用

时间:2014-07-29 09:43:21

标签: c# winforms label text-alignment onpaint

我的标签的TextAlign属性存在问题。我基于标签类创建了一个新类来覆盖OnPaint事件。我不得不重写这一点,因为我不希望标签在禁用时更改ForeColer

我并不是真的想要禁用标签,因为它没有意义,但标签位于另一个必须禁用的控件中,因此标签也被禁用。

我使用了这个OnPaint方法,它允许我设置任何我想要的预测器,即使它被禁用:

protected override void OnPaint(PaintEventArgs e)
    {
        TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
    }

但是现在由于新的OnPaint方法,TextAlign属性不起作用。

您有什么建议可以达到这两项要求吗?标签被禁用时ForeColor的更改以及通过TextAlign属性对齐文本的选项。

2 个答案:

答案 0 :(得分:0)

您缺少调用基类的OnPaint方法:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
}

看看:http://msdn.microsoft.com/de-de/library/cksxshce%28v=vs.110%29.aspx

  

覆盖继承的事件

     
      
  1. 覆盖受保护的OnEventName方法。

  2.   
  3. 从重写的OnEventName方法调用基类的OnEventName方法,以便已注册的委托接收事件。

  4.   

答案 1 :(得分:0)

我今天遇到了这个问题,这是我在此事上的分享。

基本上,因为你打电话

extRenderer.DrawText(e.Graphics, this.Text.ToString(), 
    this.Font, ClientRectangle, ForeColor);

它会从左边缘渲染字符串(注意你要发送的矩形,它从0,0开始。

我做了什么(在我的情况下,我将TextAllign设置为ContentAlignment.MiddleRight并设置了TextFormatFlags.PathEllipsis,因为我在标签上呈现了一条路径 - 同时将其指向右侧):

protected override void OnPaint(PaintEventArgs e)
{
    // Measure text
    var textSize = TextRenderer.MeasureText(Text, Font);
    if (e.ClipRectangle.Width > textSize.Width)
    {
        var x = e.ClipRectangle.Width - textSize.Width;
        var rect = new Rectangle(x, 0, textSize.Width, textSize.Height);
        TextRenderer.DrawText(e.Graphics, Text, Font, rect, ForeColor, 
            TextFormatFlags.PathEllipsis);
        return;
    }

    TextRenderer.DrawText(e.Graphics, Text, Font, e.ClipRectangle, ForeColor, 
        TextFormatFlags.PathEllipsis);
}