![]() |
Mausposition relativ zum Fenster ermitteln
Hallo,
ich versuche durch Auswertung der Nachricht WM_MOUSEMOVE die Mausposition relativ zum Fenster (Form) zu ermitteln. Das scheitert schon daran, dass in der Hilfe zu dem Thema steht "The coordinate is relative to the upper-left corner of the client area." Die Client-Area ist bei mir aber nun irgendeine beliebige, unbekannte, dynamisch erzeugte oder statische VCL-Komponente, die erst zur Laufzeit bekannt ist, z.B. ein Button, Listbox, etc. auf einem Panel auf einem Panel auf einem Panel auf einem Panel etc. Wie kann unter Auswertung welcher Message herausfinden, wie die Mausposition bezogen auf das gesamte Fenster (Form) ist? Ich versuche zu vermeiden, einen OnMouseOver-Ereignishandler zu verwenden, bitte dahingehend nicht unbedingt antworten, es muss ja auch mit Messages gehen (:!:). Vielen Dank schonmal, ich bin am Verzweifeln... Anmerkung: Bei der Auswertung von WM_MOUSEMOVE zeigt sich genau das in der Hilfe beschriebene Verhalten: die X- und Y-Koordinaten sind auf die VCL-Komponente bezogen, über der die Maus sich gerade befindet. Das nützt mir aber nix, weil ich die auf die Form bezogenen Koordinaten brauche. Kein Problem? Das dachte ich auch erst :roll: Vielleicht übersehe ich aber auch das naheliegendste... hmpf lg Caps |
AW: Mausposition relativ zum Fenster ermitteln
|
AW: Mausposition relativ zum Fenster ermitteln
Zitat:
Toni |
AW: Mausposition relativ zum Fenster ermitteln
Zitat:
|
AW: Mausposition relativ zum Fenster ermitteln
Ihr habt beide Recht :-).
Ich habe ClientToScreen schon ausprobiert, aber mit mäßigem Erfolg... (bitte entschuldigt, dass ich noch keinen Code gepostet habe, aber das alles gehört zu einem größeren Projekt, und ich weiß gar nicht, wo ich da mit Kopieren anfangen soll und vor allem aufhören muss :-D) Ich versuche es mal mit diesem Ausschnitt hier:
Delphi-Quellcode:
Das Problem ist, dass bei diesem Aufruf die Mausposition springt, d.h. falsch ist, wenn ich z.B. von einem Panel auf eine ProgressBar rolle - mit einem Wort: ich kriege so nicht die Bildschirmbezogenen Koordinaten, die ich erwarten würde.
procedure HandleApplicationEvent(pMsg: TMsg; var Handled: Boolean);
var MouseInBrowser: Boolean; mp: TPoint; begin // fensterbezogene Mausposition ermitteln... if pMsg.message = WM_MOUSEMOVE then begin MouseX := LoWord(pMsg.lParam); MouseY := HiWord(pMsg.lParam); mp.x := MouseX; mp.y := MouseY; mp := FormDATBrowser20.ClientToScreen(mp); FormDATBrowser20.Label4.Caption := 'Maus: ('+inttostr(mp.x)+', '+inttostr(mp.y)+')'; end; Ist es vielleicht falsch, die Methode ClientToScreen von der Form aufzurufen? Muss ich <überrollte Komponente>.ClientToScreen aufrufen? Dafür müsste ich die Komponente aber noch irgendwie ermitteln, gel? :? Angst... lg Caps ps: Zur Antwort "OnMouseOver durch Message getriggert": Ja, das glaube ich, aber als ich FormDATBrowser.OnMouseOver implementiert habe, gab es nur Aktivität, wenn die Maus direkt über der Form war, war ein Panel dazwischen, war Funkstille - leider keine Lösung für mich. Kann man der Form wie mit KeyPreview vllt. ein allgemeines MessagePreview mitgeben? Edit: es scheint so, als müsste ich ermitteln, welche Komponente unter der Maus ist. Hm... Abgesehen davon, dass das natürlich irgendwie schon möglich sein wird - - - gibt's keinen einfacheren Weg? Ich will doch nix weiter als die Mausposition auslesen. |
AW: Mausposition relativ zum Fenster ermitteln
Im unit Controls gibt es die Variable Mouse : TMouse;
Mouse.cursorpos gibt eine Tpoint-Variable zurück. Die x,y Werte von Tpoint geben die absoluten Bidschirmkoordinaten an. Die kann man dann in Beziehung zur gewünschten Form bringen. |
AW: Mausposition relativ zum Fenster ermitteln
Ok, das muss ich ausprobieren, danke...
Edit: Alles klar, das kommt dem schon sehr nahe, danke. Jetzt muss ich bloß noch die Koordinaten des Fensters und so weiter ins Spiel bringen, dann scheint alles zu klappen... :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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