2010-04-05 8 views
6

Desidero disegnare una personalizzazione TabControl con funzionalità personalizzate.TabRenderer senza stili visivi abilitati?

Per fare ciò, ho ereditato la classe Panel e il metodo OnPaint sovrascritto per disegnare con la classe TabRenderer.

Il problema è che TabRenderer funziona solo quando gli stili di visualizzazione sono abilitati (può essere controllato con TabRenderer.IsSupported), ma cosa devo fare se gli stili visivi sono disabilitati?

In questo caso, ho pensato di utilizzare la classe ControlPaint per disegnare le schede senza stili visivi, ma non ha metodi di disegno relativi alle schede. Lo voglio fondamentalmente comportarsi visivamente come il normale TabControl.

+0

In che modo vuoi che il tuo 'TabControl 'personalizzato sia diverso da' System.Windows.Forms.TabControl'? –

+0

Consenti animazioni come icona di una scheda, consenti il ​​pulsante X personalizzato annega su ogni scheda, Modifica la posizione e il disegno dei pulsanti sinistro e destro quando i controlli scheda non si adattano alla larghezza del controllo, consentendo il clic destro su una scheda, consenti chiudendo con il pulsante centrale del mouse, consentendo di trascinare e rilasciare le schede ... Voglio le schede funzionalmente come in Firefox. – DxCK

risposta

5

Devi disegnarlo da solo, perché non ci sono API pubblicate per questo. Speriamo che sia relativamente facile farlo in modo non visivo.

È possibile disegnare riquadro confine con ControlPaint.DrawBorder3D e usare qualcosa come il seguente codice per i pulsanti:

int Top = bounds.Top; 
int Bottom = bounds.Bottom - 1; 
int Sign = 1; 

if (tabStrip.EffectiveOrientation == TabOrientation.Bottom) 
{ 
    Top = bounds.Bottom - 1; 
    Bottom = bounds.Top; 
    Sign = -1; 
} 

using (Pen OuterLightBorderPen = new Pen(SystemColors.ControlLightLight)) 
{ 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Bottom, bounds.Left, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left, Top + 2 * Sign, bounds.Left + 2, Top); 
    e.Graphics.DrawLine(OuterLightBorderPen, bounds.Left + 2, Top, bounds.Right - 3, Top); 
} 

using (Pen InnerLightBorderPen = new Pen(SystemColors.ControlLight)) 
{ 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 1, Bottom, bounds.Left + 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(InnerLightBorderPen, bounds.Left + 2, Top + 1 * Sign, bounds.Right - 3, Top + 1 * Sign); 
} 

using (Pen OuterDarkBorderPen = new Pen(SystemColors.ControlDarkDark)) 
{ 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 2, Top + 1 * Sign, bounds.Right - 1, Top + 2 * Sign); 
    e.Graphics.DrawLine(OuterDarkBorderPen, bounds.Right - 1, Top + 2 * Sign, bounds.Right - 1, Bottom); 
} 

using (Pen InnerDarkBorderPen = new Pen(SystemColors.ControlDark)) 
    e.Graphics.DrawLine(InnerDarkBorderPen, bounds.Right - 2, Top + 2 * Sign, bounds.Right - 2, Bottom); 
+3

si potrebbe semplificare molto usando SystemPens - http://msdn.microsoft.com/en-us/library/system.drawing.systempens.aspx – Simon

+0

Grazie per questo codice! Sembra quello vero! Grazie! :-D – DxCK

0

Questa è una "là fuori" risposta, ma è mai possibile che si potrebbe usare WPF? Come puoi vedere dalla risposta sopra, è un dolore nell'orecchio personalizzare i controlli in winform dove, come in WPF, ogni controllo è privo di look. Ciò significa che controlli ciò che viene reso e come appare completamente.

+0

Grazie per il suggerimento, ma ho bisogno di supportare Windows 2000 così WPF non è un'opzione per me in questo momento. – DxCK

Problemi correlati