TabControl anders anordnen und auslagern

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Schamash.

    TabControl anders anordnen und auslagern

    Salut Com,

    ist es möglich das TabControl so anzuordnen wie im Internet Explorer 10 und darunter auslagern/anzeigen zu lassen,wenn ja wie und gibt es vielleicht dazu eine Eigenschaft ? Unten dazu ein Bild.

    Gruß iEi
    Bilder
    • AnordnenundAsulagern.PNG

      45,67 kB, 792×360, 172 mal angesehen
    Ist deine Entscheidung, ob du von "TabControl" erbst oder von "UserControl". Ich rate "UserControl". Musste halt dann alle Properties etc selber implementieren, aber du kannst dafür die Effekte besser steuern.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich hab da letztens mal was gebastelt.

    Das geht bestimmt auch schöner aber es kann dir ja als Grundgerüst dienen.

    Das TBC kann Drag & Drop und hat einen "Schließen" Button

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class odcFormatiert : Inherits System.Windows.Forms.TabControl
    2. 'Drag and Drop & Neu Anordnen
    3. Private tbp_Ausgewählt As System.Windows.Forms.TabPage = Nothing
    4. Private tbp_Ziel As System.Windows.Forms.TabPage
    5. Private rec_Hintergrund As Rectangle
    6. Private rec_SchliessenSchaltfläche As Rectangle
    7. Public Shared int_ChildFormNumber As Integer = 0 'Zählvariable für die bereits geöffneten Tabs
    8. Private Sub Tc_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles Me.DrawItem
    9. Dim brushHintergrund As Brush = New SolidBrush(Color.GhostWhite) 'Legt den "Pinsel" fest mit dem die Rechtecke gemahlt werden sollen
    10. rec_Hintergrund = e.Bounds
    11. 'Hier wird ein Rechteck über den aktuellen TabHeader gelegt
    12. rec_Hintergrund.X = rec_Hintergrund.X + rec_Hintergrund.Width
    13. rec_Hintergrund.Width = Me.Width
    14. If e.Index = Me.TabCount - 1 Then 'Wenn die letzte TabPage erreicht ist wird der restliche Hintergrund gefärbt.
    15. e.Graphics.FillRectangle(brushHintergrund, rec_Hintergrund.X, 0, rec_Hintergrund.Width, 22)
    16. End If
    17. 'Hier wird ein Rechteck über den aktuellen Tab gelegt.
    18. e.Graphics.FillRectangle(brushHintergrund, e.Bounds.X, 0, e.Bounds.Width, 22)
    19. 'festlegen der größe des zuzeichnenden Buttons
    20. Dim coordX As Integer = e.Bounds.Left + e.Bounds.Width - 18 'linke obere Ecke + Breite des Tabs - 18wegen einrücken
    21. Dim coordY As Integer = e.Bounds.Top + 2 'Y-Koord der oberen Kante + 2 wegen einrücken
    22. rec_SchliessenSchaltfläche = New Rectangle(coordX, coordY, 16, 16) 'Coordinaten des Buttons festlegen
    23. 'Formatierung der Schrift des Tabs
    24. 'notwendige Prüfung da es beim Verschieben von Tab2 auf Tab1 , bei nur 2 existierenden Tabs zu einem Fehler kommt
    25. If Not e.Index > Me.TabCount - 1 Then
    26. e.Graphics.DrawString(Me.TabPages(e.Index).Text, Font, Brushes.Black, 2 + e.Bounds.Left, 4)
    27. End If
    28. 'Einstellungen das Buttons
    29. ControlPaint.DrawCaptionButton(e.Graphics, rec_SchliessenSchaltfläche, CaptionButton.Close, ButtonState.Flat)
    30. End Sub
    31. #Region "Überlagerung der Standart Events des TabControls"
    32. Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
    33. 'Es werden 2 Unterschiedliche Events ausgelöst.
    34. '1. Entfernung der gewählten TabPage wenn der "Close"-Button gewählt wurde
    35. '2. Begin des Verschiebevorganges
    36. 'Entfernt die ausgewählte Tabpage
    37. If rec_SchliessenSchaltfläche.Contains(e.Location) Then
    38. If Not Me.SelectedTab.Text.Contains("Aktuell - ") Then
    39. Me.TabPages.RemoveAt(Me.SelectedIndex)
    40. int_ChildFormNumber -= 1
    41. Exit Sub 'wenn die TabPage geschlossenwurde darf ein Verschieben nicht mehr ausgelöst werden
    42. End If
    43. End If
    44. 'Startet das Verschieben der TabPage
    45. If (e.Button = Windows.Forms.MouseButtons.Left) AndAlso (MyBase.SelectedTab IsNot Nothing) AndAlso (Not MyBase.GetTabRect(MyBase.SelectedIndex).IsEmpty) Then
    46. Me.tbp_Ausgewählt = MyBase.SelectedTab
    47. End If
    48. MyBase.OnMouseDown(e)
    49. End Sub
    50. Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
    51. With MyBase.TabPages
    52. If (e.Button = Windows.Forms.MouseButtons.Left) AndAlso (Me.tbp_Ausgewählt IsNot Nothing) Then
    53. tbp_Ziel = TabErmitteln(e.X, e.Y)
    54. If (tbp_Ziel IsNot Nothing) Then
    55. Dim currRect As Drawing.Rectangle = MyBase.GetTabRect(.IndexOf(tbp_Ziel))
    56. 'Die TabPage wird immer auf den Index des PabPages geschrieben über dem sich die Maus befindet.
    57. 'Hier wird geprüft wo sich der MouseCursor im verhältniss zum zuverschiebenden TabPage befindent.
    58. 'Entsprechend seiner Position wird dann ein Pfeil nach Links oder Rechts angezeit.
    59. If (.IndexOf(tbp_Ziel) < .IndexOf(Me.tbp_Ausgewählt)) Then
    60. MyBase.Cursor = Cursors.PanWest
    61. ElseIf (.IndexOf(tbp_Ziel) > .IndexOf(Me.tbp_Ausgewählt)) Then
    62. MyBase.Cursor = Cursors.PanEast
    63. Else 'Die TabPage unterhalb des Cursors ist der Aktuelle (zu verschiebende) Tab -> Cursor wird Default
    64. MyBase.Cursor = Cursors.Default
    65. End If
    66. Else 'Es befindet sich keine TabPage unterhalb des Cursors -> Ein Verschieben ist hierher nicht möglich.
    67. Me.Cursor = Cursors.No
    68. End If
    69. Else 'Wenn keine TabPage ausgewählt wurde
    70. Me.Cursor = Cursors.Default
    71. End If
    72. MyBase.OnMouseMove(e)
    73. End With
    74. End Sub
    75. Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    76. With MyBase.TabPages
    77. If (e.Button = Windows.Forms.MouseButtons.Left) AndAlso (Me.tbp_Ausgewählt IsNot Nothing) Then
    78. tbp_Ziel = TabErmitteln(e.X, e.Y)
    79. If (tbp_Ziel IsNot Nothing) AndAlso (Not tbp_Ziel.Equals(Me.tbp_Ausgewählt)) Then
    80. Dim currRect As Drawing.Rectangle = MyBase.GetTabRect(.IndexOf(tbp_Ziel))
    81. If (.IndexOf(tbp_Ziel) < .IndexOf(Me.tbp_Ausgewählt)) Then
    82. .Remove(Me.tbp_Ausgewählt)
    83. .Insert(.IndexOf(tbp_Ziel), Me.tbp_Ausgewählt)
    84. MyBase.SelectedTab = Me.tbp_Ausgewählt
    85. ElseIf (.IndexOf(tbp_Ziel) > .IndexOf(Me.tbp_Ausgewählt)) Then
    86. .Remove(Me.tbp_Ausgewählt)
    87. .Insert(.IndexOf(tbp_Ziel) + 1, Me.tbp_Ausgewählt)
    88. MyBase.SelectedTab = Me.tbp_Ausgewählt
    89. End If
    90. End If
    91. End If
    92. Me.tbp_Ausgewählt = Nothing
    93. MyBase.Cursor = Cursors.Default
    94. MyBase.OnMouseUp(e)
    95. End With
    96. End Sub
    97. Private Function TabErmitteln(ByVal x As Integer, ByVal y As Integer) As TabPage
    98. For i As Integer = 0 To MyBase.TabPages.Count - 1
    99. If MyBase.GetTabRect(i).Contains(x, y) Then
    100. Return MyBase.TabPages(i)
    101. End If
    102. Next
    103. Return Nothing
    104. End Function
    105. #End Region
    106. End Class



    Ich würde mich freuen wenn du mir deine überarbeitete Version zeigen würdest.
    Ich bin noch am üben mit den UserControls. Hoffe davon dann auch lernen zu können.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    @iEi

    konntest du mein Control verbessern?
    Wenn ja würde ich das gerne sehen damit ich daraus was lernen kann. Danke!
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."