2010-01-21 6 views
25

Non riesco a trovare il modo di colorare le intestazioni di tabulazione di una pagina di tabulazione in WinForms. Esistono soluzioni per colorare la scheda indicizzata corrente utilizzando l'evento OnDrawItem ma è possibile colorare tutte le schede con colori diversi alla volta per renderli intuitivi per l'utente per un determinato comportamento.C'è un modo per colorare le schede di una tabpage in winforms?

Grazie in anticipo,

Rajeev Ranjan Lall

risposta

24

Sì, non è necessario alcun codice Win32. Devi solo impostare la scheda Control proprietà DrawMode su 'OwnerDrawFixed' e quindi gestire l'evento DrawItem del controllo struttura a schede.

Il codice seguente mostra come:

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

} 

Impostazione del DrawMode 'OwnerDrawnFixed' significa che ogni pulsante scheda deve essere della stessa dimensione (cioè fisso).

Tuttavia, se si desidera modificare le dimensioni di tutti i pulsanti scheda, è possibile impostare la proprietà SizeMode del controllo scheda per 'fisso' e quindi modificare la proprietà ItemSize.

+2

Funziona alla grande, ma come cambiereste il colore dell'area dietro le schede? – Roast

1

Utilizzando il controllo scheda corrente, se è possibile avresti bisogno di agganciare un sacco di vittoria-32 eventi (ci può essere un pre -avanzata implementazione là fuori). Un'altra alternativa potrebbe essere una sostituzione del controllo a schede di terze parti; Sono sicuro che molti venditori ti venderanno uno.

IMO, potresti trovare meno dolore a guardare WPF; è un grande cambiamento, ma ha più controllo su cose come questa. È possibile ospitare WPF all'interno di winforms se necessario (se non è possibile giustificare un completo make-over, che è una realtà piuttosto comune).

38

Una versione migliorata della risposta di 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); 
} 

Questo codice utilizza la classe TextRenderer per disegnare il suo testo (come NET fa), risolve i problemi con font di ritaglio/confezione da non gonfiare negativamente i limiti, e prende in considerazione la selezione delle schede.

Grazie a Ash per il codice originale.

+1

Questo funziona SOLO se si imposta DrawMode del controllo schede su ProprietarioDrawFixed - l'evento DrawItem non si attiva mai se è impostato su Normale. – Nitesh

Problemi correlati