2010-04-05 14 views
6

Quiero dibujar un TabControl personalizado con funcionalidad personalizada.TabRenderer sin estilos visuales habilitados?

Para hacer esto, heredé la clase Panel y he reemplazado el método OnPaint para dibujar con la clase TabRenderer.

El problema es que TabRenderer funciona solo cuando los estilos visuales están activados (se puede consultar con TabRenderer.IsSupported), pero ¿qué debo hacer si los estilos visuales están deshabilitados?

En este caso, pensé usar la clase ControlPaint para dibujar pestañas sin estilos visuales, pero no tiene métodos de dibujo relacionados con las pestañas. Quiero básicamente comportarme visualmente como el TabControl normal.

+0

¿De qué manera desea que su 'TabControl' personalizado sea diferente de' System.Windows.Forms.TabControl'? –

+0

Permitir animaciones como icono de una Pestaña, Permitir personalizar el botón X en cada Pestaña, Cambiar la ubicación y dibujar los botones izquierdo y derecho cuando los controles de Pestaña no se ajustan al ancho del control, permitiendo hacer clic derecho en una pestaña, permitir cerrando con el botón central del mouse, permitiendo arrastrar y soltar tabulaciones ... Quiero las pestañas funcionalmente como en Firefox. – DxCK

Respuesta

5

Tienes que dibujarlo solo, porque no hay una API publicada para esto. Afortunadamente, esto es relativamente fácil de hacer en forma no visualstyles.

Puede dibujar la frontera con panel ControlPaint.DrawBorder3D y usar algo como el siguiente código para los botones:

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

puede simplificar esto mucho usando SystemPens - http://msdn.microsoft.com/en-us/library/system.drawing.systempens.aspx – Simon

+0

¡Gracias por este código! ¡Parece el verdadero! ¡Gracias! :-D – DxCK

0

Esta es una respuesta "por ahí", pero es posible que usted podría utilizar WPF? Como puede ver en la respuesta anterior, es un dolor de oídos personalizar los controles en winforms donde, como en WPF, cada control es impensado. Esto significa que usted controla lo que se representa y cómo se ve por completo.

+0

Gracias por la sugerencia, pero tengo que admitir Windows 2000, por lo que WPF no es una opción para mí en este momento. – DxCK

Cuestiones relacionadas