Подтвердить что ты не робот

Есть ли способ покрасить вкладки вкладки в winforms?

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

Спасибо заранее,

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

4b9b3361

Ответ 1

Да, нет никакого кода 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" означает, что каждая кнопка табуляции должна быть того же размера (то есть исправлена).

Однако, если вы хотите изменить размер всех кнопок вкладок, вы можете установить свойство PropertyMage элемента управления вкладкой "Исправлено", а затем изменить свойство ItemSize.

Ответ 2

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

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, e.Font, paddedBounds, page.ForeColor);
}

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

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

Ответ 3

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

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