![]() |
Scrollrad und Touchpad-Bildlauf
Hallo,
ich habe eine Scrollbox mit einer unterlagerten Paintbox programmiert. Nun soll auch mit dem Scrollrad an der Maus vertikal gescrollt werden. 1. Frage: Wenn der Focus auf einer Listbox steht, so wird die Listbox durchgescrollt (häßlich!) und nicht die Scrollbox. Wie kann ich das hinbekommen, dass immer die Scrollbox das OnMouseWheel-Ereignis erhält, egal wo der Focus gerade ist? Mein Touchpad und das an anderen Laptops hat einen "virtuellen Bildlauf" und das System tut dann bspw. im Explorer so, als ob das Mausrad betätigt wurde. In meinem Programm hat dieser "virtuelle Bildlauf" aber überhaupt keine Auswirkung/Funktion. Daher die 2. Frage: Wie kann ich den "virtuellen Bildlauf" des Touchpads in ein OnMouseWheel-Ereignis transformieren? Wäre schön, wenn mir jemand helfen könnte. Danke im Voraus, Bernie110 |
Re: Scrollrad und Touchpad-Bildlauf
Liste der Anhänge anzeigen (Anzahl: 1)
Deine Form ist der Dispatcher für die MouseWheel-Message. Ich habe dir eine Beispiel-Unit erstellt, die dir zeigt, wie du deine Paintbox (bei mir ist sie einfach mal leer) mit dem Wheel rauf und runter scrollen kannst.
Grüße vom marabu |
Re: Scrollrad und Touchpad-Bildlauf
Danke, marabu, das funzt schon ganz gut.
Nur wird das Scrollrad am rechten und am unteren Rand des Form nicht erkannt, das heißt: ist der Mauszeiger in einem bestimmten Bereich rechts bzw. unten, so läßt sich die Paintbox nicht per Scrollrad bewegen. Läßt sich da noch etwas verbessern? Außerdem, weiss jemand zum 2. Punkt meiner Anfrage ' "virtueller Bildlauf" des Touchpads' eine Lösung? Bernie110 |
Re: Scrollrad und Touchpad-Bildlauf
Wenn dein mouse wheel rechts und unten nicht erkannt wird, dann liegt das daran, dass du den Rahmen der Scrollbox nicht berücksichtigst. Überprüfen kannst du das, indem du BorderStyle zum Test auf bsNone setzt. Korrigier einfach das Rect, welches du für die Funktion ptInRect() übergibst.
marabu |
Re: Scrollrad und Touchpad-Bildlauf
Funktioniert virtual scrolling mit irgendeiner Anwendung?
Hast du den Treiber für das Touchpad schon ![]() marabu |
Re: Scrollrad und Touchpad-Bildlauf
Zitat:
in Deinem Beispiel stand u.a.
Delphi-Quellcode:
Wenn ich nun statt der "ScrollBox.ClientRect" die ClientRect des Formulars einsetze, also
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean); begin if PtInRect(ScrollBox.ClientRect, ScreenToClient(MousePos)) then ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled); end; procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if PtInRect(ScrollBox.ClientRect, ScreenToClient(MousePos)) then ScrollBoxMouseWheelUp(Sender, Shift, MousePos, Handled); end;
Delphi-Quellcode:
schreibe, funktioniert es, da nun nicht mehr nur die Größe der Scrollbox auf dem Formular für die Mausaktion erkannt wird, sondern das ganze Formular.
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean); begin if PtInRect(Form.ClientRect, ScreenToClient(MousePos)) then ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled); end; procedure TMainForm.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin if PtInRect(Form.ClientRect, ScreenToClient(MousePos)) then ScrollBoxMouseWheelUp(Sender, Shift, MousePos, Handled); end; Zitat:
Den Treiber habe ich noch nicht aktualisiert. Gruß Bernie110 |
Re: Scrollrad und Touchpad-Bildlauf
Zitat:
marabu |
Re: Scrollrad und Touchpad-Bildlauf
Hallo marabu,
Leider stimmt das insofern nicht, als a) es sich nicht nur um den Rand der Scrollbox handelt (Deinen Tipp mit "BorderStyle zum Test auf bsNone setzen" habe ich ausprobiert --> brachte keine Verbesserung); b) innerhalb der Scrollbox das Scrollrad vollständig erkannt wird; c) meine Scrollbox nur ca. 4/5 der Breite und 2/3 der Höhe des Formulars einnimmt. Beispielsweise:
Delphi-Quellcode:
Dann bleiben rechts und unten jeweils 100 Pixel übrig, die vom Scrollrad nicht "erfasst" werden und nicht nur der Rahmen.
Form.Width := 500;
Form.Height := 300; Scrollbox.Top := 100; Scrollbox.Left := 100; Scrollbox.Width := 400; Scrollbox.Height := 200; Ich verstehe die Funktion "ptInRect()" auch so, dass, wenn sich die Maus in "diesem Bereich" befindet, dann wird diese Aktion an die Scrollbar weitergeleitet. Und "dieser Bereich" sollte doch das gesamte Formular sein. Bernie110 |
Re: Scrollrad und Touchpad-Bildlauf
Mein Beispiel kannst du etwa so an deine Bedürfnisse anpassen:
Delphi-Quellcode:
An diesem Code-Fragment solltest du sehen, warum dein Scrollrad rechts unten nicht erkannt wurde. Weitere Anpassungen kannst du, wenn nötig, nach dem gleichen Muster vornehmen.
procedure TMainForm.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean); var sbr: TRect; begin with Scrollbox do begin sbr.TopLeft := ClientToParent(ClientRect.TopLeft); sbr.BottomRight := ClientToParent(ClientRect.BottomRight); end; if PtInRect(sbr, ScreenToClient(MousePos)) then ScrollBoxMouseWheelDown(Sender, Shift, MousePos, Handled); end; marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz