Maus verliert Kontakt zu Scrollbalken

  • VB.NET
  • .NET (FX) 4.0

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von drschef.

    Ich habe die CustomVScrollBar angeschaut eingesetzt. Die Eleganz der Lösung und die Übersichtlichkeit hat mich beeindruckt. Ich konnte auch Einiges daraus lernen. Der Tipp war also in jedem Fall gut.

    Da im Splitcontainer links schon ein Verzeichnisbaum mit Scrollbar vorhanden ist, würde sich die CustomVScrollBar rechts grafisch und funktionell abweichend präsentieren. Da fehlen die Pfeile oben und unten. Auch das Mausrad war tot. Die Grafik hätte sich natürlich anpassen lassen.

    Nun überprüfte ich meine eigene Lösung hinsichtlich MouseWheel und siehe da. Es funktionierte auch nicht. Als ich das Event bei mir nachrüstete, zeigte sich, dass die dadurch hervorgerufenen Sprünge in der AutoScrollPosition doch relativ groß sein können. Bisher hatte ich das Layout der Thumbnails durch Umwälzen einzelner Zeilen verschoben. Das reichte nun nicht mehr aus. Ich musste Zyklen dafür einsetzen. Aber dann erlebte ich eine Überraschung, denn nun erschien beim Abriss des Mauskontakts kein leeres Panel mehr, sondern da der Algorithmus auch größere Maus-Distanzen abfängt, die Ausgangsposition des Layouts, wie beim Windows-Explorer. Wenn der Kontakt dann wieder zustande kommt, springt das Layout auch wieder an die richtige Stelle. Damit bildet sich genau das Verhalten des Windows-Explorers ab. Was will ich mehr?

    Damit kann ich meinerseits das Thema anhaken. Danke für die Mitwirkung.

    drschef schrieb:

    Da fehlen die Pfeile oben und unten. Auch das Mausrad war tot. Die Grafik hätte sich natürlich anpassen lassen.
    Da kannst Du ja mal Deine Variation von vorstellen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier ist aus 25.000 VB-Zeilen der Ausschnitt zum Scrollen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Ex_MouseWheel(ByVal sender As Object, e As MouseEventArgs) Handles SC.Panel2.MouseWheel
    2. 'Weiterschalten bei Mausrad
    3. DeltaWheel = -1 * e.Delta
    4. If DeltaWheel = 0 Then Exit Sub
    5. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    6. ScrollDiff = ScrollNew - ScrollAlt
    7. 'PP("VZ= " & ScrollVZ & " ScDiff/ScNew/ScAlt= " & ScrollDiff & " / " & ScrollNew & " / " & ScrollAlt)
    8. If ScrollDiff > 0 Then
    9. ScrollVZ = +1
    10. Do While ScrollDiff > HZelle 'Schleife deckt auch größere Sprünge ab
    11. ShiftLine(ScrollVZ)
    12. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    13. ScrollDiff = ScrollNew - ScrollAlt
    14. Loop
    15. Else
    16. ScrollVZ = -1
    17. Do While ScrollDiff < 0 'Schleife deckt auch größere Sprünge ab
    18. ShiftLine(ScrollVZ)
    19. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    20. ScrollDiff = ScrollNew - ScrollAlt
    21. Loop
    22. End If
    23. End Sub
    24. Private Sub Ex_Scroll(ByVal sender As System.Object, e As ScrollEventArgs) Handles SC.Panel2.Scroll
    25. If e.NewValue = e.OldValue Then Exit Sub
    26. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    27. ScrollDiff = ScrollNew - ScrollAlt
    28. 'PP("VZ= " & ScrollVZ & " ScDiff/ScNew/ScAlt= " & ScrollDiff & " / " & ScrollNew & " / " & ScrollAlt)
    29. If ScrollDiff > 0 Then
    30. ScrollVZ = +1
    31. Do While ScrollDiff > HZelle 'Schleife deckt auch größere Sprünge ab
    32. ShiftLine(ScrollVZ)
    33. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    34. ScrollDiff = ScrollNew - ScrollAlt
    35. Loop
    36. Else
    37. ScrollVZ = -1
    38. Do While ScrollDiff < 0 'Schleife deckt auch größere Sprünge ab
    39. ShiftLine(ScrollVZ)
    40. ScrollNew = -SC.Panel2.AutoScrollPosition.Y 'Aktuelle Scrollposition abrufen
    41. ScrollDiff = ScrollNew - ScrollAlt
    42. Loop
    43. End If
    44. End Sub
    45. Private Sub ShiftLine(VZ As Integer)
    46. Dim Z As Zelle
    47. Dim iNeu As Integer
    48. Select Case VZ
    49. Case +1
    50. If ScrollDiff < HZelle Then Exit Sub
    51. 'PP("Umwälzen +",, "B")
    52. ScrollAlt += HZelle 'Alte Scrollposition um HZelle anheben
    53. For i = ifirst To ifirst + Spalten - 1 'Zeile von links nach rechts
    54. iNeu = i + cMove 'Verschiebung des Index nach unten (Spalten * ZeiPlus)
    55. If iNeu > IFLA.Length - 1 Then Exit For 'Ziel ist unbenutzte Zelle
    56. Z = ZvonI(i)
    57. If Z Is Nothing Then Exit For
    58. DeMarkiereZelle(Z)
    59. Z.Name = Zellname(iNeu) 'Zelle neu belegen
    60. Z.LN.Text = Z.Name
    61. Z.Top += yMove
    62. If ImageReady(iNeu) Then
    63. Z.LB.Text = IFLA(iNeu).Name
    64. Z.PB.BackgroundImage = IMGA(iNeu)
    65. End If
    66. If IvonZ(Z) = iMark Then MarkiereZelle(Z)
    67. Next
    68. ifirst += Spalten
    69. iLast += Spalten
    70. Case -1
    71. If ScrollDiff >= 0 Then Exit Sub
    72. 'PP("Umwälzen -",, "B")
    73. ScrollAlt -= HZelle 'Alte Scrollposition um HZelle absenken
    74. For i = iLast - Spalten + 1 To iLast 'Zeile von links nach rechts
    75. iNeu = i - cMove 'Verschiebung des Index nach oben (Spalten * ZeiPlus)
    76. If iNeu < 0 Then Exit For 'Ziel ist unbenutzte Zelle
    77. Z = ZvonI(i)
    78. If Z Is Nothing Then Exit For
    79. DeMarkiereZelle(Z)
    80. Z.Name = Zellname(iNeu) 'Zelle neu belegen
    81. Z.LN.Text = Z.Name
    82. Z.Top -= yMove
    83. If ImageReady(iNeu) Then
    84. Z.LB.Text = IFLA(iNeu).Name
    85. Z.PB.BackgroundImage = IMGA(iNeu)
    86. End If
    87. If IvonZ(Z) = iMark Then MarkiereZelle(Z)
    88. Next
    89. ifirst -= Spalten
    90. iLast -= Spalten
    91. End Select
    92. End Sub