Вкладка C # Win Forms Ошибка ширины вкладки Control - PullRequest
0 голосов
/ 03 мая 2011

У меня есть пользовательский элемент управления вкладками, где метод OnPaint переопределен. Затем происходит странный рост вкладок. Размер вкладок увеличивается (отступы увеличиваются), а их ширина зависит от длины текста. Когда я использую Tab Control по умолчанию - заполнение в порядке. Как избежать этой ситуации, когда я использую 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 ]

2 голосов
/ 04 мая 2011

Из изображения видно, что ваш код устанавливает размер вкладок шире, чем они должны быть.Дополнительный отступ присутствует во всех ваших вкладках, но он просто более заметен во вкладках с более длинным текстом.

Я не могу быть уверен, почему это так, но я бы предположил, что код для расчета размеравкладки (на основе метрик шрифта) используют шрифт, отличный от того, который использовался для рисования вкладок.

2 голосов
/ 04 мая 2011

Включение ControlStyles.UserPaint для элементов управления, встроенных в Windows, таких как TabControl, не является правильным решением.Я предполагаю, что ошибка в GetTabRect (), она не видна во фрагменте.

Вместо этого вам следует использовать свойство TabControl.DrawMode и реализовать событие DrawItem.В библиотеке MSDN есть хороший пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...