2010-01-21 2 views
25

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

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

Раджив Ranjan Lall

ответ

24

Да, код 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 элемента управления вкладкой «Исправлено», а затем изменить свойство ItemSize.

+2

Отлично работает, но как бы вы изменили цвет области за вкладками? – Roast

1

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

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

38

Усовершенствованного вариант ответа Эша:

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 делает), исправлены проблемы с шрифтом вырезкой/ПОДАЮЩИЙСЯ не отрицательно завышения оценки, и учитывает выбор вкладок.

Благодаря Ash для исходного кода.

+1

Это ТОЛЬКО работает, если вы установите DrawMode элемента управления вкладкой на OwnerDrawFixed - событие DrawItem никогда не срабатывает, если оно установлено в Normal. – Nitesh

Смежные вопросы