![]() |
ScrollBar nachbauen
Hallo,
ich habe meine eigene Scrollbar, die auch funktioniert. Nur eines noch nicht, nämlich nach ca. einer halben Sekunde bei gedrückter Maustaste (in der Scrollbar, außerhalb der Scrollleiste) die Scrollleiste bis zum Mauszeiger wandern zu lassen. Mein Code habe ich in OnMouseDown und da wandert die Scrollleiste gleich los. Also ich brauche einen Unterschied, wenn der Benutzer nur kurz mal die Maustaste drückt (Scrollleiste wandert nur eine Position weiter) und wenn er auf der Maustaste draufbleibt. So wie halt bei der echten ScrollBar. Ich habe da versuche (in OnMouseDown) mit einer While/End Schleife, zwei GetTickCount Werte und Application.ProcessMessages unternommen. Natürlich in OnMouseUp einen Variable gesetzt, damit die While/End-Schleife auch abbrechen kann. Aber das ging nur bedingt denn es kommt ja wohl auch darauf an, was und wieviel Code nach einem wandern der Scrollleiste so passiert. Ich denke, es ist auch nicht die richtige Lösung mit so einer Schleife. Bleibt da nur ein Thread übrig oder gibt's für so ein Fall einen besonderen Trick? Michael |
AW: ScrollBar nachbauen
Es über einen Timer steuern eventuell?
Also Timer wird angeworfen wenn User Maus-Event fürs "hab-jetzt-Taste-gedrückt" wenn Timer fertig dann startet die eigentliche "ich-habe-noch-Taste-gedrückt-und-erwarte-bewegung" Ausführung. |
AW: ScrollBar nachbauen
Zitat:
Meine ScrollBar ändert für eine ListBox die TopIndex bzw. mit SendMessage und WM_HSCROLL/SB_PAGEDOWN wird der Inhalt gescrollt. Die ListBox selbst ist mit WS_EX_COMPOSITED gesetzt. Irgendwie bleibt der erste Scrollzustand mit einem Smooth Scrolling behaftet, der zwar nicht angezeigt wird (wegen WS_EX_COMPOSITED) aber diese Millisekunden werden dennoch verarbeitet, sprich die Reaktion auf "OnMouseDown" in meiner ScrollBar mit anschließenden SendMessage (damit die Listbox scrollt) reagiert versetzt. Dies aber nur beim ersten mal und deshalb kam ich da mit meiner While/End Schleife und Application.ProcessMessages nicht ganz weiter. Ich mach nun einfach "SPI_SETLISTBOXSMOOTHSCROLLING" rein, was leider aber Systemweit gesetzt wird. Nach Programmende schalte ich dann dieses Smooth wieder ein. So geht auch meine While/End Schleife für die ScrollBar und durch dieses SPI_SETLISTBOXSMOOTHSCROLLING sind auch andere Kinderkrankheiten weg, die mir gar nicht zuvor aufgefallen sind. Alles bissl kompliziert zu beschreiben :) Jetzt muss ich nur noch irgendwie SPI_SETLISTBOXSMOOTHSCROLLING abfragen, ob dieses überhaupt aktiviert ist, da ich es ja bei Programmende aktiviere. Soll ja nur aktiviert werden, wenn es vom System her auch vorher aktiv ist. Dir trotzdem Danke für den Tipp mit dem Timer. Michael |
AW: ScrollBar nachbauen
Delphi-Quellcode:
So könnte man den Wert abfragen.
SystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, @EinBoolean, 0);
|
AW: ScrollBar nachbauen
Zitat:
Grüße Dalai |
AW: ScrollBar nachbauen
Autsch, ja klar so sollte es sein, mein Fehler!!! Ich sollte echt ma wieder zu Fielmann zum Optiker.
|
AW: ScrollBar nachbauen
Danke für die Info zu "SPI_GETLISTBOXSMOOTHSCROLLING"
Michael |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz