C#Win Forms选项卡控制选项卡宽度错误

时间:2011-05-03 08:16:49

标签: c# winforms forms

我有自定义选项卡控件,其中OnPaint方法被覆盖。 然后发生奇怪的标签增长。标签越来越大(填充越来越大),它们的宽度取决于文本的长度。 当我使用默认的Tab控件 - 填充是可以的。当我使用UserPaint时如何避免这种情况?

enter image description here

partial class Tab : TabControl
{
    public Tab()
    {
        InitializeComponent();
        Init();
    }

     private void Init()
    {
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.DoubleBuffer, true);
        this.SetStyle(ControlStyles.ResizeRedraw, true);
    }
    protected override void OnPaint(PaintEventArgs e)
    {
       DrawTabPane(e.Graphics);
    }

    private void DrawTabPane(Graphics g)
{
       if (!Visible)
      return;

       // here we draw our tabs
       for (int i = 0; i < this.TabCount; i++)
         DrawTab(g, this.TabPages[i], i);
    }
    internal void DrawTab(Graphics g, TabPage tabPage, int nIndex)
    {
        Rectangle recBounds = this.GetTabRect(nIndex);
        RectangleF tabTextArea = recBounds;

        Point[] pt = new Point[4];
        pt[0] = new Point(recBounds.Left + 1, recBounds.Bottom);
        pt[1] = new Point(recBounds.Left + 1, recBounds.Top + 1);
        pt[2] = new Point(recBounds.Right - 1, recBounds.Top + 1);
        pt[3] = new Point(recBounds.Right - 1, recBounds.Bottom);

        Brush br = new SolidBrush(clr_tab_norm);
        g.FillPolygon(br, pt);
        br.Dispose();

        StringFormat stringFormat = new StringFormat();
        stringFormat.Alignment = StringAlignment.Center;
        stringFormat.LineAlignment = StringAlignment.Center;
        br = new SolidBrush(clr_txt);

        g.DrawString(tabPage.Text, Font, br, tabTextArea, stringFormat);
    }

}

2 个答案:

答案 0 :(得分:2)

启用ControlStyles.UserPaint以获取内置于Windows中的控件(如TabControl),这不是正确的做法。我假设错误在GetTabRect()中,它在代码段中不可见。

相反,您应该使用TabControl.DrawMode属性并实现DrawItem事件。在MSDN Library中有一个很好的例子。

答案 1 :(得分:2)

从图像中可以看出,您的代码将标签的大小设置为比它们需要的更宽。额外填充在所有选项卡中都有,但在文本较长的选项卡中更加明显。

我无法确定为什么会这样,但我猜测计算标签大小的代码(基于字体指标)使用的字体与用于绘制标签的字体不同。