2010-01-21 5 views
25

Ich bin schwer zu finden, wie Sie die Tab-Header einer Registerkarte in WinForms färben. Es gibt Lösungen, um die aktuelle indizierte Registerkarte mit dem OnDrawItem-Ereignis einzufärben. Es kann jedoch auch möglich sein, alle Registerkarten mit unterschiedlichen Farben zu versehen, um sie für Benutzer bei einem bestimmten Verhalten intuitiv zu machen.Gibt es eine Möglichkeit, Registerkarten einer Registerkarte in Winforms zu färben?

Vielen Dank im Voraus,

Rajeev Ranjan Lall

Antwort

24

Ja, es ist kein Win32-Code erforderlich. Sie müssen nur die DrawMode-Eigenschaft der Registersteuerelemente auf "OwnerDrawFixed" festlegen und dann das DrawItem-Ereignis des Registersteuerelements verarbeiten.

Der folgende Code zeigt, wie:

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

} 

die DrawMode zu 'OwnerDrawnFixed' Einstellung bedeutet, dass jeder Reiter-Taste die gleiche Größe sein muss (dh Fixed).

Wenn Sie jedoch die Größe aller Registerkarten ändern möchten, können Sie die SizeMode-Eigenschaft des Registerkartensteuerelements auf "Fixed" setzen und dann die ItemSize-Eigenschaft ändern.

+2

Funktioniert gut, aber wie würden Sie die Farbe des Bereichs hinter den Tabs ändern? – Roast

1

die aktuelle Registerkarte Verwendung, wenn es möglich ist, müssten Sie eine Menge Win-32 Veranstaltungen Haken (es eine Pre sein kann -wrapped Implementierung da draußen). Eine andere Alternative wäre ein Tabbed-Control-Ersatz von Drittanbietern; Ich bin sicher, dass viele Verkäufer Ihnen einen verkaufen werden.

IMO, Sie könnten es weniger Schmerz finden, um WPF zu betrachten; Es ist eine große Veränderung, aber hat mehr Kontrolle über solche Dinge. Sie können WPF bei Bedarf in Winforms hosten (wenn Sie ein vollständiges make-over nicht rechtfertigen können, was eine ziemlich häufige Realität ist).

38

Eine verbesserte Version von Ashs Antwort:

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

Dieser Code verwendet die TextRenderer Klasse den Text zu ziehen (wie .NET tut), behebt Probleme mit Schrift Clipping/Verpackung von nicht negativ auf die Grenzen Aufpumpen und berücksichtigt Tab-Auswahl.

Dank Ash für den ursprünglichen Code.

+1

Dies funktioniert nur, wenn Sie den DrawMode des Tab-Steuerelements auf OwnerDrawFixed setzen - das DrawItem-Ereignis wird nie ausgelöst, wenn es auf Normal festgelegt ist. – Nitesh

Verwandte Themen