Ayuda con un tabControl propio...

Hostilio X. Macias Pacheco
04 de Marzo del 2005
Observando códigos y páginas y por la necesidad de poder colocar colores a los tabs he trabajado en un tabControl propio pero por alguna razón no me acepta cuando coloco la posicion del tab abajo o cuando uso multi line y en un caso especifico no me sale ni el texo,... çAyuda por favor.. Este es el código:

Public Class MyTabControl
Inherits System.Windows.Forms.TabControl
Private miColorFondoActivo As Color = Color.Gray
Private miColorFondoActivoSel As Color = Color.WhiteSmoke
Private miColorFondoInactivo As Color = Color.LightGray
Private miColorLetraActivo As Color = Color.Red
Private miColorLetraActivoSel As Color = Color.OrangeRed
Private miColorLetraInactivo As Color = Color.LightCoral
Private miEstiloFuente As fontStyle = fontStyle.Bold
Private miColorGradientFondoActivo As Color = Color.Gray
Private miColorGradientFondoActivoSel As Color = Color.WhiteSmoke
Private miColorGradientFondoInactivo As Color = Color.LightGray
Private miGradient As Boolean = False


#Region " Código generado por el Diseñador de componentes "

Public Sub New(ByVal Container As System.ComponentModel.IContainer)
MyClass.New()

'Requerido para la compatibilidad con el Diseñador de composiciones de clases Windows.Forms
Container.Add(Me)
End Sub

Public Sub New()
MyBase.New()

'El Diseñador de componentes requiere esta llamada.
InitializeComponent()

'Agregar cualquier inicialización después de la llamada a InitializeComponent()

End Sub

'Component reemplaza a Dispose para limpiar la lista de componentes.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requerido por el Diseñador de componentes
Private components As System.ComponentModel.IContainer

'NOTA: el Diseñador de componentes requiere el siguiente procedimiento
'Se puede modificar utilizando el Diseñador de componentes.
'No lo modifique con el editor de código.
Friend WithEvents TabControl1 As System.Windows.Forms.TabControl
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.TabControl1 = New System.Windows.Forms.TabControl
'
'TabControl1
'
Me.TabControl1.Location = New System.Drawing.Point(17, 17)
Me.TabControl1.Name = "TabControl1"
Me.TabControl1.SelectedIndex = 0
Me.TabControl1.TabIndex = 0
'
'MyTabControl
'

End Sub

#End Region

#Region "SEt y Gets de Variables"

#Region "variable pàra saber si quieren en gradient"
Public Property Gradient() As Boolean
Get
Gradient = Me.miGradient
End Get
Set(ByVal Value As Boolean)
Me.miGradient = Value
End Set
End Property
#End Region

#Region "fondo"
Public Property colorFondoActivo() As Color
Get
colorFondoActivo = miColorFondoActivo
End Get
Set(ByVal Value As Color)
miColorFondoActivo = Value
End Set
End Property
Public Property colorFondoActivoSel() As Color
Get
colorFondoActivoSel = miColorFondoActivoSel
End Get
Set(ByVal Value As Color)
miColorFondoActivoSel = Value
End Set
End Property
Public Property colorFondoInactivo() As Color
Get
colorFondoInactivo = miColorFondoInactivo
End Get
Set(ByVal Value As Color)
miColorFondoInactivo = Value
End Set
End Property

Public Property colorGradientFondoActivo() As Color
Get
colorGradientFondoActivo = miColorGradientFondoActivo
End Get
Set(ByVal Value As Color)
miColorGradientFondoActivo = Value
End Set
End Property
Public Property colorGradientFondoActivoSel() As Color
Get
colorGradientFondoActivoSel = miColorGradientFondoActivoSel
End Get
Set(ByVal Value As Color)
miColorGradientFondoActivoSel = Value
End Set
End Property
Public Property colorGradientFondoInactivo() As Color
Get
colorGradientFondoInactivo = miColorGradientFondoInactivo
End Get
Set(ByVal Value As Color)
miColorGradientFondoInactivo = Value
End Set
End Property
#End Region

#Region "letra"
Public Property colorLetraActivo() As Color
Get
colorLetraActivo = miColorLetraActivo
End Get
Set(ByVal Value As Color)
miColorLetraActivo = Value
End Set
End Property
Public Property colorLetraInactivo() As Color
Get
colorLetraInactivo = miColorLetraInactivo
End Get
Set(ByVal Value As Color)
miColorLetraInactivo = Value
End Set
End Property
Public Property colorLetraActivoSel() As Color
Get
colorLetraActivoSel = miColorLetraActivoSel
End Get
Set(ByVal Value As Color)
miColorLetraActivoSel = Value
End Set
End Property
Public Property fontStyle() As fontStyle
Get
fontStyle = miEstiloFuente
End Get
Set(ByVal Value As fontStyle)
miEstiloFuente = Value
End Set
End Property
#End Region

#End Region

#Region "Control de las etiquetas de los Tabs"

Private Sub MyTabControl_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles MyBase.DrawItem
Dim f As Font
Dim foreBrush As Brush
Dim backbrush As System.Drawing.Drawing2D.LinearGradientBrush

If sender.TabPages(e.Index).enabled = True Then
If e.Index = sender.SelectedIndex Then
If miGradient Then
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoActivoSel, miColorGradientFondoActivoSel, Drawing2D.LinearGradientMode.ForwardDiagonal)
Else
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoActivoSel, miColorFondoActivoSel, Drawing2D.LinearGradientMode.ForwardDiagonal)
End If
foreBrush = New SolidBrush(miColorLetraActivoSel)
Else
If miGradient Then
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoActivo, miColorGradientFondoActivo, Drawing2D.LinearGradientMode.BackwardDiagonal)
Else
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoActivo, miColorFondoActivo, Drawing2D.LinearGradientMode.BackwardDiagonal)
End If
foreBrush = New SolidBrush(miColorLetraActivo)
End If
Else
If Gradient Then
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoInactivo, miColorGradientFondoInactivo, Drawing2D.LinearGradientMode.Horizontal)
Else
backbrush = New System.Drawing.Drawing2D.LinearGradientBrush(e.Bounds, miColorFondoInactivo, miColorFondoInactivo, Drawing2D.LinearGradientMode.Horizontal)
End If
foreBrush = New SolidBrush(miColorLetraInactivo)
End If
e.Graphics.FillRectangle(backbrush, e.Bounds)
f = New Font(e.Font, miEstiloFuente)
Dim tabName As String = sender.TabPages(e.Index).Text
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
Dim r As RectangleF = New RectangleF(e.Bounds.X, e.Bounds.Y + 4, e.Bounds.Width, e.Bounds.Height - 4)
e.Graphics.DrawString(tabName, f, foreBrush, r, sf)
sf.Dispose()
f.Dispose()
foreBrush.Dispose()
backbrush.Dispose()
End Sub
Private Sub MyTabControl_StyleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.StyleChanged
'Para que se lea los cambios hechos, se vea el contenido de lsa tabs ...
MyBase.DrawMode = TabDrawMode.OwnerDrawFixed
End Sub
#End Region

Private Sub MyTabControl_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SelectedIndexChanged
Dim a As TabControl
a = sender
If a.TabPages.Count > 0 Then
If sender.TabPages(a.SelectedIndex()).enabled = False Then
If a.SelectedIndex > 1 Then
a.SelectedIndex = a.SelectedIndex - 1
Else
If a.TabPages.Count > a.SelectedIndex + 1 Then
a.SelectedIndex = a.SelectedIndex + 1
End If
End If
End If
End If
End Sub

End Class