2 Textboxen syncron scrollen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von rogerberglen.

    2 Textboxen syncron scrollen

    Hiho zusammen..

    Hab nen neues Problem. Ich hab 2 Textboxen, die genau die gleiche Anzahl an Zeilen haben und ich möchte jetzt, dass wenn man bei einer runterscrollt, dass die andere mitgescrollt wird. Gibts da irgendwelche Tricks? Bei google hab ich nur sehr umständliche und unter vb2008 nicht funktionsfähige Lösungen gefunden.

    Also eure kreativität ist gefragt auf dieses Simple Problem eine Lösung zu finden :thumbsup:
    So überaus aufwändig ist das auch wieder nicht (hat ca 45 min gedauert)

    Man nehme eine leere Form und diesen Code (Textboxen werden zur Laufzeit per Code erstellt)

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private WithEvents TextBox1 As MyTextbox
    4. Private WithEvents TextBox2 As MyTextbox
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. 'TextBox1
    7. Me.TextBox1 = New MyTextbox
    8. Me.TextBox1.Location = New System.Drawing.Point(8, 14)
    9. Me.TextBox1.Multiline = True
    10. Me.TextBox1.Name = "TextBox1"
    11. Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
    12. Me.TextBox1.Size = New System.Drawing.Size(130, 243)
    13. Me.TextBox1.TabIndex = 0
    14. '
    15. 'TextBox2
    16. Me.TextBox2 = New MyTextbox
    17. Me.TextBox2.Location = New System.Drawing.Point(150, 14)
    18. Me.TextBox2.Multiline = True
    19. Me.TextBox2.Name = "TextBox2"
    20. Me.TextBox2.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
    21. Me.TextBox2.Size = New System.Drawing.Size(130, 243)
    22. Me.TextBox2.TabIndex = 1
    23. Me.Controls.Add(Me.TextBox1)
    24. Me.Controls.Add(Me.TextBox2)
    25. For j As Integer = 0 To 3
    26. For i As Integer = 65 To 90
    27. Me.TextBox1.Text &= Chr(i) & " " & j.ToString & vbCrLf
    28. Me.TextBox2.Text &= Chr(i) & " " & j.ToString & vbCrLf
    29. Next
    30. Next
    31. End Sub
    32. Private Sub TextBox_ScrollChanged(ByVal sender As MyTextbox, ByVal Pos As Integer, ByVal Action As Integer) _
    33. Handles TextBox1.ScrollChanged, TextBox2.ScrollChanged
    34. Static SbooSelfCall As Boolean = False
    35. If SbooSelfCall Then Exit Sub
    36. SbooSelfCall = True
    37. If sender Is Me.TextBox1 Then
    38. Me.TextBox2.ChangeScroll(Pos, Action)
    39. Me.TextBox2.SelectionStart = Me.TextBox1.SelectionStart
    40. Else
    41. Me.TextBox1.ChangeScroll(Pos, Action)
    42. Me.TextBox1.SelectionStart = Me.TextBox2.SelectionStart
    43. End If
    44. SbooSelfCall = False
    45. End Sub
    46. End Class
    47. '// ********************************************************************************************************
    48. Public Class MyTextbox
    49. Inherits TextBox
    50. Private Const WM_KEYDOWN As Integer = &H100
    51. Private Const WM_VSCROLL As Integer = &H115
    52. Private Const SB_TOP As Integer = 6
    53. Private Const SB_BOTTOM As Integer = 7
    54. Private Const SB_LINEDOWN As Integer = 1
    55. Private Const SB_LINEUP As Integer = 0
    56. Private Const WM_USER As Integer = &H400
    57. Private Const EM_CURSORSCROLL As Integer = WM_USER + 7441
    58. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    59. '// Für Aufteilung/Kombination Integer -> High + Low
    60. <StructLayout(LayoutKind.Explicit)> Structure HiLoCalc
    61. <FieldOffset(0)> Dim Value As Integer
    62. <FieldOffset(0)> Dim Low As UInt16
    63. <FieldOffset(2)> Dim High As UInt16
    64. End Structure
    65. '// wird ausgelöst wenn die Textbox gescrollt wird
    66. Public Event ScrollChanged(ByVal sender As MyTextbox, ByVal Pos As Integer, ByVal Action As Integer)
    67. Public Sub ChangeScroll(ByVal Pos As Integer, ByVal Action As Integer)
    68. '// wird aufgerufen wenn die Textbox scrollen soll
    69. Dim lh As HiLoCalc
    70. lh.High = CType(Pos, UInt16)
    71. lh.Low = CType(Action, UInt16)
    72. SendMessage(MyBase.Handle, WM_VSCROLL, lh.Value, 0)
    73. End Sub
    74. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    75. Static SintDownKey As Integer = 0
    76. Select Case m.Msg
    77. Case WM_KEYDOWN
    78. '// Den Key merken, wird im EM_CURSORSCROLL benötigt
    79. '// um die Richtung festzustellen
    80. SintDownKey = m.WParam.ToInt32
    81. Case EM_CURSORSCROLL
    82. '// Diese Message wurde von der Textbox registriert
    83. '// (Spy++ spuckt da nur aus: Benutzerdefiniert = WM_USER + 7441)
    84. '// Diese Message kommt immer dann, wenn wegen der Cursortasten gescrollt wird
    85. Select Case SintDownKey
    86. Case Keys.Up
    87. RaiseEvent ScrollChanged(Me, 0, SB_LINEUP)
    88. Case Keys.Down
    89. RaiseEvent ScrollChanged(Me, 0, SB_LINEDOWN)
    90. End Select
    91. Case WM_VSCROLL
    92. '// Es wird über die Scrollbar oder Mausrad gescrollt
    93. Dim lh As HiLoCalc
    94. lh.Value = CInt(m.WParam)
    95. RaiseEvent ScrollChanged(Me, CInt(lh.High), CInt(lh.Low))
    96. End Select
    97. MyBase.WndProc(m)
    98. End Sub
    99. Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
    100. '// Bei den Tastenkombinationen ist es hier einfacher, die Modifiers
    101. '// festzustellen, deshalb hier extra und nicht in der WndProc
    102. Select Case e.KeyCode
    103. Case Keys.Home
    104. If e.Modifiers = Keys.Control Then
    105. '// Tastenkombination Strg+Pos1
    106. RaiseEvent ScrollChanged(Me, 0, SB_TOP)
    107. End If
    108. Case Keys.End
    109. If e.Modifiers = Keys.Control Then
    110. '// Tastenkombination Strg+ Ende
    111. RaiseEvent ScrollChanged(Me, 0, SB_BOTTOM)
    112. End If
    113. End Select
    114. MyBase.OnKeyDown(e)
    115. End Sub
    116. End Class


    Code ist in VB 2005, sollte aber mit VB 2008 genauso funktionieren

    Edit: Verbessert, jetzt klappts auch mit den Cursortasten etc

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Gaga“ ()

    Irgendwas passt da nicht so ganz, denn die zweite TextBox wird immer um 2 Zeilen gescrollt wenn man mit den Pfeiltasten arbeitet. Außerdem wird die zweite Textbox nicht gescrollt, mit den Pfeiltasten, wenn diese den Focus hat.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „rogerberglen“ ()