Moin moin
Ich habe mir das TabControl mal etwas umgebaut. Soweit klappt alles wie ich es wollte. Einzig, die "Scroll-Button" des TabControls bekomme ich nicht anders designed. Siehe Bildanhang... sowas von unschööön...
Vielleicht kann mir dabei jemand helfen
Hier mal mein Code:
Spoiler anzeigen
Ich habe mir das TabControl mal etwas umgebaut. Soweit klappt alles wie ich es wollte. Einzig, die "Scroll-Button" des TabControls bekomme ich nicht anders designed. Siehe Bildanhang... sowas von unschööön...
Vielleicht kann mir dabei jemand helfen
Hier mal mein Code:
Das Form: (CustomTabControl auf das Form gezogen)
Die Klasse zum setzen der Farben:
Das CustomTabControl:
Das Form: (CustomTabControl auf das Form gezogen)
Die Klasse zum setzen der Farben:
VB.NET-Quellcode
- Public Class TabControlColorManager
- Inherits PropertyChange
- ' Singleton-Instanz für den zentralen Zugriff auf die Farbanpassungen
- Public Shared ReadOnly Property Instance As New TabControlColorManager()
- ' Eigenschaften zur Definition der Farbschemata
- Public Property TabControlForeColor As Color ' Schriftfarbe des TabControls
- Public Property TabControlBackColor As Color ' Hintergrundfarbe des gesamten TabControls
- Public Property TabControlBorderColor As Color ' Rahmenfarbe des gesamten TabControls
- Public Property TabPagesForeColor As Color ' Schriftfarbe der TabPages
- Public Property TabPagesBackColor As Color ' Hintergrundfarbe der TabPages
- Public Property TabPageBorderColor As Color ' Rahmenfarbe der aktiven TabPage
- Public Property TabControlBordersize As Integer ' Rahmenbreite des TabControl
- Public Property TabPageBordersize As Integer ' Rahmenbreite der TabPages
- Public Property TabHoverColor As Color ' Die HoverColor der Tabreiter
- Private Sub New()
- ' Standardfarben definieren
- TabControlBackColor = Color.FromArgb(40, 40, 40) ' Hintergrund für das TabControl
- TabControlBorderColor = Color.FromArgb(90, 90, 90) ' Rahmen um das TabControl
- TabControlBordersize = 1 ' Bordersize des TabControl
- TabControlForeColor = Color.SteelBlue ' Schriftfarbe für die Reiter
- TabHoverColor = Color.FromArgb(80, 80, 80) ' HoverColor
- TabPagesForeColor = Color.Beige ' Schriftfarbe innerhalb der TabPages
- TabPagesBackColor = Color.FromArgb(60, 60, 60) ' Hintergrundfarbe der TabPages
- ' Optionaler Rahmen um die TabPage (Standart BorderStyle auf None)
- TabPageBordersize = 1 ' Bordersize der TabPages
- TabPageBorderColor = Color.FromArgb(90, 90, 90)
- End Sub
- ' Methode zum Anwenden der definierten Farben auf ein TabControl
- Public Sub ApplyColors(tabControl As TabControl)
- ' Farben für das gesamte TabControl setzen
- tabControl.ForeColor = TabControlForeColor
- tabControl.BackColor = TabControlBackColor
- ' Farben für jede TabPage individuell setzen
- For Each page As TabPage In tabControl.TabPages
- page.ForeColor = TabPagesForeColor
- page.BackColor = TabPagesBackColor
- Next
- ' TabControl zur Neuzeichnung auffordern
- tabControl.Invalidate()
- End Sub
- End Class
Das CustomTabControl:
VB.NET-Quellcode
- Public Class CustomTabControl
- Inherits TabControl
- ' Index des Tabs, über dem die Maus aktuell schwebt
- Private hoveredTabIndex As Integer = -1
- Public Sub New()
- MyBase.New()
- Me.SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer, True)
- Me.DrawMode = TabDrawMode.OwnerDrawFixed
- End Sub
- Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
- MyBase.OnMouseMove(e)
- ' Ermitteln, über welchem Tab die Maus schwebt
- Dim newHoveredIndex As Integer = -1
- For i As Integer = 0 To Me.TabPages.Count - 1
- If Me.GetTabRect(i).Contains(e.Location) Then
- newHoveredIndex = i
- Exit For
- End If
- Next
- ' Wenn der Hover-Index sich geändert hat, neu zeichnen
- If newHoveredIndex <> hoveredTabIndex Then
- hoveredTabIndex = newHoveredIndex
- Me.Invalidate()
- End If
- End Sub
- Protected Overrides Sub OnMouseLeave(e As EventArgs)
- MyBase.OnMouseLeave(e)
- ' Hover-Effekt entfernen, wenn die Maus das TabControl verlässt
- If hoveredTabIndex <> -1 Then
- hoveredTabIndex = -1
- Me.Invalidate()
- End If
- End Sub
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- MyBase.OnPaint(e)
- ' Hintergrund des gesamten TabControl zeichnen
- Dim backColor As Color = TabControlColorManager.Instance.TabControlBackColor
- Using backBrush As New SolidBrush(backColor)
- e.Graphics.FillRectangle(backBrush, Me.ClientRectangle)
- End Using
- ' Tab-Reiter und Rahmen zeichnen
- For i As Integer = 0 To Me.TabPages.Count - 1
- DrawTab(e.Graphics, i)
- Next
- ' Rahmen des TabControl zeichnen
- Using borderPen As New Pen(TabControlColorManager.Instance.TabControlBorderColor, TabControlColorManager.Instance.TabControlBordersize)
- Dim rect As Rectangle = Me.ClientRectangle
- rect.Width -= 1
- rect.Height -= 1
- e.Graphics.DrawRectangle(borderPen, rect)
- End Using
- ' Rahmen um die aktive TabPage zeichnen
- If Me.SelectedIndex >= 0 Then
- DrawTabPageBorder(e.Graphics)
- End If
- End Sub
- Private Sub DrawTab(g As Graphics, index As Integer)
- Dim tabRect As Rectangle = Me.GetTabRect(index)
- ' Farben für den Tab-Reiter abrufen
- Dim backColor As Color
- If index = hoveredTabIndex Then
- backColor = TabControlColorManager.Instance.TabHoverColor ' Hover-Farbe verwenden
- ElseIf index = Me.SelectedIndex Then
- backColor = TabControlColorManager.Instance.TabPagesBackColor ' Aktiver Tab
- Else
- backColor = TabControlColorManager.Instance.TabControlBackColor ' Standardfarbe
- End If
- Dim foreColor As Color = If(index = Me.SelectedIndex, TabControlColorManager.Instance.TabPagesForeColor, TabControlColorManager.Instance.TabControlForeColor)
- ' Hintergrund des Tabs zeichnen
- Using backBrush As New SolidBrush(backColor)
- g.FillRectangle(backBrush, tabRect)
- End Using
- ' Text des Tabs zeichnen
- Using textBrush As New SolidBrush(foreColor)
- Dim text As String = Me.TabPages(index).Text
- Dim sf As New StringFormat With {
- .Alignment = StringAlignment.Center,
- .LineAlignment = StringAlignment.Center
- }
- g.DrawString(text, Me.Font, textBrush, tabRect, sf)
- End Using
- End Sub
- ' Methode, die einen Rahmen um die TabPages zeichnet
- Private Sub DrawTabPageBorder(g As Graphics)
- Dim borderSize As Integer = TabControlColorManager.Instance.TabPageBordersize
- If borderSize <= 0 Then Exit Sub
- ' Aktive TabPage ermitteln
- Dim pageRect As Rectangle = Me.TabPages(Me.SelectedIndex).Bounds
- Using borderPen As New Pen(TabControlColorManager.Instance.TabPageBorderColor, borderSize)
- g.DrawRectangle(borderPen, New Rectangle(pageRect.Left - 1, pageRect.Top - 1, pageRect.Width + 1, pageRect.Height + 1))
- End Using
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.