Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ScrollBar nachbauen (https://www.delphipraxis.net/197055-scrollbar-nachbauen.html)

MicMic 14. Jul 2018 20:56

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

KodeZwerg 14. Jul 2018 21:39

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.

MicMic 15. Jul 2018 12:18

AW: ScrollBar nachbauen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407293)
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.

Danke, hab da bissl rumgetestet. Danach mein Problem an ganz andere Stelle entdeckt.
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

KodeZwerg 15. Jul 2018 13:13

AW: ScrollBar nachbauen
 
Delphi-Quellcode:
SystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, @EinBoolean, 0);
So könnte man den Wert abfragen.

Dalai 15. Jul 2018 13:24

AW: ScrollBar nachbauen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1407324)
Delphi-Quellcode:
SystemParametersInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, @EinBoolean, 0);
So könnte man den Wert abfragen.

Dann aber bitte mit SPI_GETLISTBOXSMOOTHSCROLLING.

Grüße
Dalai

KodeZwerg 15. Jul 2018 13:29

AW: ScrollBar nachbauen
 
Autsch, ja klar so sollte es sein, mein Fehler!!! Ich sollte echt ma wieder zu Fielmann zum Optiker.

MicMic 15. Jul 2018 19:36

AW: ScrollBar nachbauen
 
Danke für die Info zu "SPI_GETLISTBOXSMOOTHSCROLLING"
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz