Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Mausposition relativ zum Fenster ermitteln (https://www.delphipraxis.net/172708-mausposition-relativ-zum-fenster-ermitteln.html)

Caps 18. Jan 2013 13:50

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

DeddyH 18. Jan 2013 13:54

AW: Mausposition relativ zum Fenster ermitteln
 
Ich denke, Du suchst Delphi-Referenz durchsuchenScreenToClient bzw. Delphi-Referenz durchsuchenClientToScreen.

Tonic1024 18. Jan 2013 13:55

AW: Mausposition relativ zum Fenster ermitteln
 
Zitat:

Zitat von Caps (Beitrag 1199614)
irgendeine beliebige, unbekannte, dynamisch erzeugte oder statische VCL-Komponente

Hat diese Komponente vielleicht eine Methode Namens ClientToScreen? Das würd ja schon helfen...

Toni

Medium 18. Jan 2013 14:02

AW: Mausposition relativ zum Fenster ermitteln
 
Zitat:

Zitat von Caps (Beitrag 1199614)
Ich versuche zu vermeiden, einen OnMouseOver-Ereignishandler zu verwenden, bitte dahingehend nicht unbedingt antworten, es muss ja auch mit Messages gehen (:!:).

Nur am Rande: OnMouseMove()-Events werden durch WM_MOUSEMOVE Messages getriggert, und sind daher eigentlich genau das selbe nur etwas verpackt. Bei OnMouseOver bin ich nicht 100%ig sicher, aber da dürfte das selbe zutreffen. Es spricht zunächst nichts dagegen die Message selbst zu behandeln, aber es steckt letztlich genau das selbe dahinter.

Caps 18. Jan 2013 14:11

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:
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;
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.

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.

wolfgang_SV 18. Jan 2013 14:39

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.

Caps 18. Jan 2013 14:51

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 07:44 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