Hallo, ich würde mit diesem Tutorial gerne zeigen wir wir uns ein eigenes Tabcontroll mit einem Hover Effekt erstellen. Zuerst sollte unsere Klasse von dem TabControl erben.
danach müssen wir für den Hover Style zwei Globale Variabeln Deklarieren.
mit isHover wird im Späteren verlauf sich die maus in dem Bereich der Tabpages Aufhält und mit hoverTab wird der index der Tabpage gesetzt auf der Sich die maus aufhält.
So nun übershcreiben wir uns das Paint Event und fügen den Code hinzu
Erklärung des Codes
Mit drawbg(e) wird der Rahmen unserer Tabpage Gezeichnet. diese methode erstellen wir selbst und übergeben PaintEventArgs an die Methode
Danach laufen wir in einer for-Schleife die Tabpages durch und überprüfen ob die Variable isHover = true ist und ob sich die Maus auf dem Aktuelle Tabpage Header befindet. Wenn dies beides wahr ist führen wird die Methode
ist diese Bedingung nicht wahr zeichnen wir die headers normal mit der methode
in dieser methode wird mit
geprüft ob die Aktuelle Registerkarte gleich die Aktuelle Register Karte ist. ist es wahr wird die methode
Das war die Komplette Zeichnen methoden. Nun kommen die hover methoden. Wir starten mit einer Überschreibung des Mouse move events. danach erstellen wir uns ein neues Rechteck dieses ist der bereich der Tabheaders. es wird nun geprüft ob sich die maus in dem bereich aufhält. Ist es wahr laufen wir alle Tabpages in einer for-schleife durch. in der Schleife erstellen wir das rechteck des Tabheaders und prüfen ob sich die maus in diesem rechteck aufhält. ist dies auch wahr setzen wir
So nun kommen wir zu der Methode wenn wir das Control verlassen, soll auch die Variable
So nun sollte unsere Tabcontrol so aussehen
![](https://www.vb-paradise.de/index.php/Attachment/26351-Tabcontrol-JPG/?thumbnail=1&s=8df497d53d1f07a4bda225b008ddde051415e9ba)
Grüße Andy![8-)](https://www.vb-paradise.de/wcf/images/smilies/cool.png)
Edit by hal2000:
- Topic verschoben: Für ein Tutorial nicht ausreichend erklärt.
danach müssen wir für den Hover Style zwei Globale Variabeln Deklarieren.
mit isHover wird im Späteren verlauf sich die maus in dem Bereich der Tabpages Aufhält und mit hoverTab wird der index der Tabpage gesetzt auf der Sich die maus aufhält.
So nun übershcreiben wir uns das Paint Event und fügen den Code hinzu
Erklärung des Codes
Mit drawbg(e) wird der Rahmen unserer Tabpage Gezeichnet. diese methode erstellen wir selbst und übergeben PaintEventArgs an die Methode
Danach laufen wir in einer for-Schleife die Tabpages durch und überprüfen ob die Variable isHover = true ist und ob sich die Maus auf dem Aktuelle Tabpage Header befindet. Wenn dies beides wahr ist führen wird die Methode
drawhoverTab(e,i)
aus. Diese erstellen wir auch wieder selbstVB.NET-Quellcode
- Private Sub drawhoverTab(e As PaintEventArgs, i As Integer)
- Dim orect As Rectangle = GetTabRect(i)
- Dim color As Color = System.Drawing.Color.FromArgb(255, 255, 244, 190)
- Dim color2 As Color = System.Drawing.Color.FromArgb(255, 255, 219, 98)
- Dim X1 As Integer = orect.X
- Dim Y1 As Integer = orect.Y
- Dim W1 As Integer = orect.Width
- Dim H1 As Integer = orect.Height / 2
- Dim X2 As Integer = orect.X
- Dim Y2 As Integer = orect.Height / 2
- Dim W2 As Integer = orect.Width
- Dim H2 As Integer = orect.Height / 2
- Dim brush1 As New Drawing2D.LinearGradientBrush(New Point(W1 / 2, Y1), New Point(W1 / 2, H1), color, color2)
- Dim brush2 As New Drawing2D.LinearGradientBrush(New Point(W2 / 2, Y2), New Point(W2 / 2, orect.Height), color2, color)
- Dim sf As New StringFormat
- sf.LineAlignment = StringAlignment.Center
- sf.Alignment = StringAlignment.Center
- e.Graphics.FillRectangle(brush1, New Rectangle(X1, Y1, W1, H1))
- e.Graphics.FillRectangle(brush2, New Rectangle(X2, Y2, W2, H2))
- e.Graphics.DrawLine(New Pen(New SolidBrush(color2)), New Point(orect.X, orect.Height / 2), New Point(orect.X + orect.Width, orect.Height / 2))
- e.Graphics.DrawString(TabPages(i).Text, TabPages(i).Font, New SolidBrush(TabPages(i).ForeColor), GetTabRect(i), sf)
- End Sub
ist diese Bedingung nicht wahr zeichnen wir die headers normal mit der methode
drawheaders(e,i)
VB.NET-Quellcode
- Private Sub drawheaders(e As PaintEventArgs, i As Integer)
- If SelectedIndex = i Then
- drawSelectedTab(e, i)
- Exit Sub
- End If
- Dim oRect As Rectangle = GetTabRect(i)
- Dim H As Integer = oRect.Height
- Dim W As Integer = oRect.Width
- Dim X As Integer = oRect.X
- Dim Y As Integer = oRect.Y
- ' Punkt Links Unten
- Dim P1 As New Point(X, H)
- ' Punkt Links Oben
- Dim P2 As New Point(X, Y)
- ' Punkte Rechts Oben
- Dim P3 As New Point(X + W, Y)
- ' Punkt Rechts Unten
- Dim P4 As New Point(X + W, H)
- Dim p As New Drawing.Drawing2D.GraphicsPath
- p.AddLine(P1, P2)
- p.AddLine(P2, P3)
- p.AddLine(P3, P4)
- p.AddLine(P4, P1)
- Dim sf As New StringFormat
- sf.LineAlignment = StringAlignment.Center
- sf.Alignment = StringAlignment.Center
- e.Graphics.FillPath(Brushes.DarkGray, p)
- e.Graphics.DrawString(TabPages(i).Text, TabPages(i).Font, New SolidBrush(TabPages(i).ForeColor), GetTabRect(i), sf)
- End Sub
in dieser methode wird mit
geprüft ob die Aktuelle Registerkarte gleich die Aktuelle Register Karte ist. ist es wahr wird die methode
drawSelectedTab(e, i)
aufgerufen und den rest des Subs Beendet. Diese prüfung ist wichtig, das wir die Aktuellen Registrier Karte anderst dagestellt bekommen.VB.NET-Quellcode
- Private Sub drawSelectedTab(e As PaintEventArgs, i As Integer)
- Dim orect As Rectangle = GetTabRect(i)
- Dim color As Color = System.Drawing.Color.FromArgb(255, 129, 164, 206)
- Dim color2 As Color = System.Drawing.Color.FromArgb(255, 44, 98, 186)
- Dim brush1 As New Drawing2D.LinearGradientBrush(New Point(orect.X + orect.Width / 2, orect.Y), New Point(orect.X + orect.Width / 2, orect.Height / 2), color, color2)
- Dim brush2 As New Drawing2D.LinearGradientBrush(New Point(orect.X + orect.Width / 2, orect.Height / 2), New Point(orect.X + orect.Width / 2, orect.Height), color2, color)
- Dim sf As New StringFormat
- sf.LineAlignment = StringAlignment.Center
- sf.Alignment = StringAlignment.Center
- e.Graphics.FillRectangle(brush1, New Rectangle(orect.X, orect.Y, orect.Width, orect.Height))
- e.Graphics.FillRectangle(brush2, New Rectangle(orect.X, orect.Height / 2, orect.Width, orect.Height / 2))
- e.Graphics.DrawLine(New Pen(New SolidBrush(color2)), New Point(orect.X, orect.Height / 2), New Point(orect.X + orect.Width, orect.Height / 2))
- e.Graphics.DrawString(TabPages(i).Text, TabPages(i).Font, New SolidBrush(TabPages(i).ForeColor), GetTabRect(i), sf)
- End Sub
Das war die Komplette Zeichnen methoden. Nun kommen die hover methoden. Wir starten mit einer Überschreibung des Mouse move events. danach erstellen wir uns ein neues Rechteck dieses ist der bereich der Tabheaders. es wird nun geprüft ob sich die maus in dem bereich aufhält. Ist es wahr laufen wir alle Tabpages in einer for-schleife durch. in der Schleife erstellen wir das rechteck des Tabheaders und prüfen ob sich die maus in diesem rechteck aufhält. ist dies auch wahr setzen wir
isHover
auf True und weisen hoverTab
unseren Tabpage index zu. hier ist der Code dazuVB.NET-Quellcode
- Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
- MyBase.OnMouseMove(e)
- Dim tabrect As New Rectangle(0, 0, MyBase.Width, MyBase.ItemSize.Height)
- If tabrect.Contains(e.Location) Then
- For i = 0 To TabCount - 1
- Dim rect As Rectangle = GetTabRect(i)
- If rect.Contains(e.Location) Then
- isHover = True
- hoverTab = i
- End If
- Next
- Else
- isHover = False
- End If
- Me.Invalidate()
- End Sub
So nun kommen wir zu der Methode wenn wir das Control verlassen, soll auch die Variable
isHover
auf false. Für die methode überschreiben wir die MouseLeave Methode.So nun sollte unsere Tabcontrol so aussehen
Grüße Andy
![8-)](https://www.vb-paradise.de/wcf/images/smilies/cool.png)
Edit by hal2000:
- Topic verschoben: Für ein Tutorial nicht ausreichend erklärt.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hal2000“ ()