2009-12-04 2 views
4

Cela semble être une question simple mais comment définir la couleur de l'onglet 'contrôle de tabulation', il semble provenir de la fenêtre standard couleur du thème. Est-il possible de créer un contrôle onglet noir avec du texte blanc écrit sur les onglets eux-mêmes (pas la page à onglet)? Aide, je suis un peu familier avec les contrôles personnalisés étendant les contrôles existants mais je ne sais pas quelles propriétés (si elles existent) à définir.C# Winform: Comment définir la couleur de base d'un TabControl (pas l'onglet)

Répondre

2

http://dotnetrix.co.uk/tabcontrol.htm

private void tabControl1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
{ 
TabPage CurrentTab = tabControl1.TabPages[e.Index]; 
Rectangle ItemRect = tabControl1.GetTabRect(e.Index); 
SolidBrush FillBrush = new SolidBrush(Color.Red); 
SolidBrush TextBrush = new SolidBrush(Color.White); 
StringFormat sf = new StringFormat(); 
sf.Alignment = StringAlignment.Center; 
sf.LineAlignment = StringAlignment.Center; 

//If we are currently painting the Selected TabItem we'll 
//change the brush colors and inflate the rectangle. 
if (System.Convert.ToBoolean(e.State & DrawItemState.Selected)) 
{ 
    FillBrush.Color = Color.White; 
    TextBrush.Color = Color.Red; 
    ItemRect.Inflate(2, 2); 
} 

//Set up rotation for left and right aligned tabs 
if (tabControl1.Alignment == TabAlignment.Left || tabControl1.Alignment == TabAlignment.Right) 
{ 
    float RotateAngle = 90; 
    if (tabControl1.Alignment == TabAlignment.Left) 
     RotateAngle = 270; 
    PointF cp = new PointF(ItemRect.Left + (ItemRect.Width/2), ItemRect.Top + (ItemRect.Height/2)); 
    e.Graphics.TranslateTransform(cp.X, cp.Y); 
    e.Graphics.RotateTransform(RotateAngle); 
    ItemRect = new Rectangle(-(ItemRect.Height/2), -(ItemRect.Width/2), ItemRect.Height, ItemRect.Width); 
} 

//Next we'll paint the TabItem with our Fill Brush 
e.Graphics.FillRectangle(FillBrush, ItemRect); 

//Now draw the text. 
e.Graphics.DrawString(CurrentTab.Text, e.Font, TextBrush, (RectangleF)ItemRect, sf); 

//Reset any Graphics rotation 
e.Graphics.ResetTransform(); 

//Finally, we should Dispose of our brushes. 
FillBrush.Dispose(); 
TextBrush.Dispose(); 
} 
+0

Merci! Je vais vérifier ça. – Zion

1

J'utilise quelque chose comme ça dans la classe dérivée mu TabControl (et il fera aussi des gradients):

protected override void OnDrawItem(DrawItemEventArgs e) 
{ 
    // fill in the whole rect 
    using (SolidBrush br = new SolidBrush(Theme.FormBackColor)) 
    { 
     e.Graphics.FillRectangle(br, ClientRectangle); 
    } 

    // draw the tabs 
    for (int i = 0; i < TabPages.Count; ++i) 
    { 
     TabPage tab = TabPages[i]; 
     // Get the text area of the current tab 
     RectangleF tabTextArea = (RectangleF)GetTabRect(i); 

     // determine how to draw the tab based on which type of tab it is 
     Color tabTopBackColor = GetTopBackColor(); 
     Color tabBottomBackColor = GetBottomBackColor(); 
     Color tabTextColor = GetTextColor(); 

     // draw the background 
     using (LinearGradientBrush br = new LinearGradientBrush(tabTextArea, tabTopBackColor, tabBottomBackColor, LinearGradientMode.Vertical)) 
     { 
      e.Graphics.FillRectangle(br, tabTextArea); 
     } 

     // draw the tab header text 
     using (SolidBrush brush = new SolidBrush(tabTextColor)) 
     { 
      e.Graphics.DrawString(tab.Text, Font, brush, CreateTabHeaderTextRect(tabTextArea)); 
     } 
    } 
} 

private RectangleF CreateTabHeaderTextRect(RectangleF tabTextArea) 
{ 
    tabTextArea.X += 3; 
    tabTextArea.Y += 1; 

    tabTextArea.Height -= 1; 

    return tabTextArea; 
} 
Questions connexes