2010-01-21 2 views
25

J'ai du mal à trouver le moyen de colorier les en-têtes d'onglet d'un onglet dans WinForms. Il existe des solutions pour colorer l'onglet indexé en cours à l'aide de l'événement OnDrawItem, mais il peut être possible de colorier tous les onglets avec des couleurs différentes à la fois pour les rendre intuitifs pour l'utilisateur pour un certain comportement.Existe-t-il un moyen de colorier les onglets d'un onglet dans des winforms?

Merci à l'avance,

Rajeev Ranjan Lall

Répondre

24

Oui, le code win32 n'est pas nécessaire. Vous devez juste définir la propriété DrawMode des onglets sur 'OwnerDrawFixed', puis gérer l'événement DrawItem du contrôle onglet.

Le code suivant montre comment:

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

} 

Réglage de la DrawMode à « OwnerDrawnFixed » signifie que chaque bouton onglet doit être de la même taille (c.-à-fixe). Toutefois, si vous souhaitez modifier la taille de tous les boutons d'onglets, vous pouvez définir la propriété SizeMode du contrôle Onglet sur "Fixe", puis modifier la propriété ItemSize.

+2

Fonctionne très bien, mais comment changeriez-vous la couleur de la zone derrière les onglets? – Roast

1

Utilisation du contrôle onglet en cours, si il est possible que vous aurez besoin d'accrocher beaucoup de gagnant-32 événements (il peut y avoir un pré implémentation enveloppée là-bas). Une autre alternative serait un remplacement de contrôle par onglets d'une tierce partie; Je suis sûr que beaucoup de vendeurs vous en vendront un. IMO, vous pourriez trouver moins de peine à regarder WPF; C'est un grand changement, mais il a plus de contrôle sur des choses comme ça. Vous pouvez héberger WPF à l'intérieur des winforms si nécessaire (si vous ne pouvez pas justifier un make-over complet, ce qui est une réalité assez courante).

38

Une version améliorée de la réponse 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); 
} 

Ce code utilise la classe TextRenderer pour dessiner le texte (comme .NET ne), corrige les problèmes avec coupure de police/emballage en ne gonflant négativement les limites, et prend en compte la sélection d'onglets.

Merci à Ash pour le code original.

+1

Cela fonctionne UNIQUEMENT si vous définissez le DrawMode de votre contrôle d'onglet sur OwnerDrawFixed - l'événement DrawItem ne se déclenche jamais s'il est défini sur Normal. – Nitesh

Questions connexes