2011-03-17 39 views
18

Saludos,Conjunto TabPage jefe del color

que tienen un control de ficha y yo quiero tener 1 de las pestañas tienen que es el color del texto cambiado en un evento. He encontrado respuestas como C# - TabPage Color event y C# Winform: How to set the Base Color of a TabControl (not the tabpage) pero con estos juegos se usan todos los colores en lugar de uno.

¿Estaba esperando que haya una forma de implementar esto con la pestaña que deseo cambiar como método en lugar de como evento?

Algo así como:

public void SetTabPageHeaderColor(TabPage page, Color color) 
{ 
    //Text Here 
} 

Respuesta

24

Si desea colorear las pestañas, pruebe el siguiente código:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; 
this.tabControl1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tabControl1_DrawItem); 

private Dictionary<TabPage, Color> TabColors = new Dictionary<TabPage, Color>(); 
private void SetTabHeader(TabPage page, Color color) 
{ 
    TabColors[page] = color; 
    tabControl1.Invalidate(); 
} 
private void tabControl1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    //e.DrawBackground(); 
    using (Brush br = new SolidBrush (TabColors[tabControl1.TabPages[e.Index]])) 
    { 
     e.Graphics.FillRectangle(br, e.Bounds); 
     SizeF sz = e.Graphics.MeasureString(tabControl1.TabPages[e.Index].Text, e.Font); 
     e.Graphics.DrawString(tabControl1.TabPages[e.Index].Text, e.Font, Brushes.Black, e.Bounds.Left + (e.Bounds.Width - sz.Width)/2, e.Bounds.Top + (e.Bounds.Height - sz.Height)/2 + 1); 

     Rectangle rect = e.Bounds; 
     rect.Offset(0, 1); 
     rect.Inflate(0, -1); 
     e.Graphics.DrawRectangle(Pens.DarkGray, rect); 
     e.DrawFocusRectangle(); 
    } 
} 
+0

Todavía basado en un evento. Quiero tener un método como "SetTabHeader (página TabPage, Color del color)" –

+0

@Levisaxos, he agregado el método que requería. Pero aún requerirás el evento. –

+0

¡Funciona como un encanto! ¡Muchas gracias! –

16

Para WinForms usuarios que leen esto - esto sólo funciona si se establece DrawMode de su tarjeta de registro OwnerDrawFixed: el evento DrawItem nunca se dispara si está configurado en Normal.

+0

gracias hombre !! es por eso que no estaba disparando !! :) –

6

Para añadir a respuesta Diversión Mun Pieng 's que funciona muy bien en pestañas horizontales, si usted fuera a utilizar pestañas verticales (como yo) entonces tendría algo como esto:

private void tabControl2_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     using (Brush br = new SolidBrush(tabColorDictionary[tabControl2.TabPages[e.Index]])) 
     { 
      // Color the Tab Header 
      e.Graphics.FillRectangle(br, e.Bounds); 
      // swap our height and width dimensions 
      var rotatedRectangle = new Rectangle(0, 0, e.Bounds.Height, e.Bounds.Width); 

      // Rotate 
      e.Graphics.ResetTransform(); 
      e.Graphics.RotateTransform(-90); 

      // Translate to move the rectangle to the correct position. 
      e.Graphics.TranslateTransform(e.Bounds.Left, e.Bounds.Bottom, System.Drawing.Drawing2D.MatrixOrder.Append); 

      // Format String 
      var drawFormat = new System.Drawing.StringFormat(); 
      drawFormat.Alignment = StringAlignment.Center; 
      drawFormat.LineAlignment = StringAlignment.Center; 

      // Draw Header Text 
      e.Graphics.DrawString(tabControl2.TabPages[e.Index].Text, e.Font, Brushes.Black, rotatedRectangle, drawFormat); 
     } 
    } 

que se hagan eco el punto de que ROJO1969 hecho, si esto es en WinForms - a continuación, debe configurar DrawMode a OwnerDrawFixed.

Agradecimientos especiales a este maravilloso blog entry que describió cómo hacer una rotación de texto en un formulario.

Cuestiones relacionadas