2010-01-21 13 views
25

Tengo dificultades para encontrar la forma de colorear los encabezados de las pestañas de un tabpage en WinForms. Existen soluciones para colorear la pestaña indexada actual mediante el evento OnDrawItem, pero puede ser posible colorear todas las pestañas con diferentes colores a la vez para que sean intuitivas para un determinado comportamiento del usuario.¿Hay alguna manera de colorear las pestañas de un tabpage en winforms?

Gracias de antemano,

Rajeev Ranjan Lall

Respuesta

24

Sí, no hay necesidad de ningún código win32. Solo tiene que establecer la pestaña Controles de la propiedad DrawMode en 'OwnerDrawFixed' y luego manejar el evento DrawItem del control de pestañas.

El código siguiente muestra cómo:

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); 

} 

Ajuste de la DrawMode a 'OwnerDrawnFixed' significa cada botón pestaña tiene que ser del mismo tamaño (es decir, fijo).

Sin embargo, si desea cambiar el tamaño de todos los botones de tabulación, puede establecer la propiedad SizeMode del control de tabulación en 'Fixed' y luego cambiar la propiedad ItemSize.

+2

Funciona muy bien, pero ¿cómo cambiarías el color del área detrás de las pestañas? – Roast

1

Utilizando el actual control de ficha, si es posible que había necesidad de conectar un montón de victoria-32 eventos (puede haber un pre implementación envuelta por ahí). Otra alternativa sería un reemplazo de control con pestañas de terceros; Estoy seguro de que muchos vendedores te venderán uno.

IMO, puede que le resulte menos doloroso mirar WPF; es un gran cambio, pero tiene más control sobre cosas como esta. Puede alojar WPF dentro de los winforms si es necesario (si no puede justificar un cambio completo, que es una realidad bastante común).

38

Una versión mejorada de la respuesta de Ash:

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); 
} 

Este código utiliza la clase TextRenderer para dibujar el texto (como .NET hace), fija problemas con la fuente de recortes/envoltura por no inflar negativamente a los límites, y toma en cuenta la selección de pestañas.

Gracias a Ash por el código original.

+1

Esto SÓLO funciona si establece el Modo de dibujo del control de pestañas en OwnerDrawFixed - el evento DrawItem nunca se dispara si está establecido en Normal. – Nitesh

Cuestiones relacionadas