Есть ли способ покрасить вкладки вкладки в winforms? - PullRequest
26 голосов
/ 21 января 2010

Я изо всех сил пытаюсь найти способ закрасить заголовки вкладок вкладки в WinForms. Существуют решения по окраске текущей индексированной вкладки с использованием события OnDrawItem, но можно ли покрасить все вкладки разными цветами одновременно, чтобы сделать их интуитивно понятными для пользователя для определенного поведения.

Заранее спасибо,

Раджив Ранджан Лалл

Ответы [ 3 ]

44 голосов
/ 05 марта 2011

Улучшенная версия ответа Эша:

private void tabControl_DrawItem(object sender, DrawItemEventArgs e)
{
    TabPage page = tabControl.TabPages[e.Index];
    e.Graphics.FillRectangle(new SolidBrush(page.BackColor), e.Bounds);

    Rectangle paddedBounds = e.Bounds;
    int yOffset = (e.State == DrawItemState.Selected) ? -2 : 1;
    paddedBounds.Offset(1, yOffset);
    TextRenderer.DrawText(e.Graphics, page.Text, Font, paddedBounds, page.ForeColor);
}

Этот код использует класс TextRenderer для отрисовки своего текста (как это делает .NET), исправляет проблемы с обрезкой / переносом шрифта, не увеличивая границы негативно, и учитывает выбор табуляции.

Спасибо Эшу за оригинальный код.

28 голосов
/ 21 января 2010

Да, никакой код win32 не нужен. Вам просто нужно установить свойство DrawMode для элементов управления вкладками в OwnerDrawFixed, а затем обработать событие DrawItem элемента управления для вкладок.

Следующий код показывает, как:

private void tabControl1_DrawItem(object sender, DrawItemEventArgs e)
{
    // This event is called once for each tab button in your tab control

    // First paint the background with a color based on the current tab

   // e.Index is the index of the tab in the TabPages collection.
    switch (e.Index )
    {
        case 0:
            e.Graphics.FillRectangle(new SolidBrush(Color.Red), e.Bounds);
            break;
        case 1:
            e.Graphics.FillRectangle(new SolidBrush(Color.Blue), e.Bounds);
            break;
        default:
            break;
    }

    // Then draw the current tab button text 
    Rectangle paddedBounds=e.Bounds;
    paddedBounds.Inflate(-2,-2);  
    e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, this.Font, SystemBrushes.HighlightText, paddedBounds);

}

Установка DrawMode в OwnerDrawnFixed означает, что каждая кнопка вкладки должна быть одинакового размера (т.е. фиксированной).

Однако если вы хотите изменить размер всех кнопок вкладки, вы можете установить для свойства SizeMode элемента управления вкладкой значение «Fixed», а затем изменить свойство ItemSize.

1 голос
/ 21 января 2010

Используя текущий элемент управления вкладками, , если , возможно, вам понадобится перехватить много событий win-32 (там может быть предварительно реализованная реализация). Другой альтернативой будет замена стороннего элемента управления с вкладками; Я уверен, что многие продавцы будут продавать вам один.

ИМО, вам может показаться менее болезненным смотреть на WPF; это большое изменение, но оно имеет больший контроль над такими вещами. При необходимости вы можете разместить WPF внутри winforms (если вы не можете оправдать полный перестройку, что является довольно распространенной реальностью).

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