Delphi-PRAXiS
Seite 3 von 4     123 4      

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/)
-   -   Ermitteln ob die Maus auf der Form ist? (https://www.delphipraxis.net/166429-ermitteln-ob-die-maus-auf-der-form-ist.html)

jaenicke 13. Feb 2012 14:27

AW: Ermitteln ob die Maus auf der Form ist?
 
TApplicationEvents auf das Formular --> OnMessage:
Delphi-Quellcode:
procedure TForm257.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  ClientRectAbs: TRect;
begin
  if Msg.message = WM_MOUSELEAVE then
  begin
    ClientRectAbs.TopLeft := ClientToScreen(ClientRect.TopLeft);
    ClientRectAbs.BottomRight := ClientToScreen(ClientRect.BottomRight);
    InflateRect(ClientRectAbs, -2, -2);
    if not PtInRect(ClientRectAbs, Mouse.CursorPos) then
      Caption := Caption + 'AA';
  end;
end;
Zum Testen schreibt das einfach etwas in die Caption.

Sir Rufo 13. Feb 2012 14:50

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von smart (Beitrag 1150778)
wie kan man ermitteln ob die Maus noch im Fenster oder ausserh. des Fensters ist?

Brauchst du jetzt eine Abfrage oder ein Event?

Eine Abfrage würde so aussehen:
Delphi-Quellcode:
function MouseOverWindow( aHandle : HWND ) : Boolean;
var
  wndHandle : HWND;
begin
  wndHandle := WindowFromPoint( Mouse.CursorPos );

  while ( wndHandle <> 0 ) and ( wndHandle <> aHandle ) do
    begin
      wndHandle := GetParent( wndHandle );
    end;

  Result := ( wndHandle <> 0 );
end;
und in deinem Projekt dann so:
Delphi-Quellcode:
procedure TForm1.Timer1Timer( Sender : TObject );
begin
  // Wir nehmen das Handle dieser Form
  if MouseOverWindow( Self.Handle ) then
    Caption := 'ja'
  else
    Caption := 'false';
end;

smart 13. Feb 2012 15:04

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von Perlsau (Beitrag 1150810)
Zitat:

Zitat von smart (Beitrag 1150778)
wie kan man ermitteln ob die Maus noch im Fenster oder ausserh. des Fensters ist?

Wofür brauchst du das denn?

Wenn ich über meine Anwendung mit der Maus fahre, soll meine Anwendung die Farbe wechselen.

jaenicke 13. Feb 2012 15:08

AW: Ermitteln ob die Maus auf der Form ist?
 
Dann passt mein Quelltext ja. Fehlt nur zusätzlich noch die Prüfung auf WM_MOUSEMOVE um ggf. die Farbe zu ändern und in dem obigen Code kannst du sie zurück ändern.

Sir Rufo 13. Feb 2012 16:11

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von jaenicke (Beitrag 1150824)
Dann passt mein Quelltext ja. Fehlt nur zusätzlich noch die Prüfung auf WM_MOUSEMOVE um ggf. die Farbe zu ändern und in dem obigen Code kannst du sie zurück ändern.

Nun ja, so ganz ja nicht, denn die Message
Delphi-Quellcode:
WM_MOUSELEAVE
wird auch dann gesendet, wenn man von der Form auf ein anderes Control wechselt.
Wenn die Maus dann passend stehen bleibt, kommt auch kein passendes
Delphi-Quellcode:
WM_MOUSEMOVE
.

jaenicke 13. Feb 2012 16:28

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1150849)
Nun ja, so ganz ja nicht, denn die Message
Delphi-Quellcode:
WM_MOUSELEAVE
wird auch dann gesendet, wenn man von der Form auf ein anderes Control wechselt.

Deshalb prüfe ich ja auch die Mausposition um nur beim echten Verlassen zu reagieren. Und MouseMove kommt ja dann bei jeder Bewegung. Sollte doch also passen.

ASM 13. Feb 2012 16:35

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von jaenicke (Beitrag 1150824)
Dann passt mein Quelltext ja.

Erstens, funktioniert das mit Hilfe des ApplicationEvents1Message-Events zwar mit Delphi XE, jedoch merkwürdigerweise nicht mit Delphi 7.
Zweitens, wird (wenn es denn funktioniert, z.B. mit Delphi XE) die Kopfzeile der Form bereits als außerhalb der Form gewertet. Nicht sehr sinnvoll.

Die einzig verlässliche Vorgehensweise ist also die per Funktion MouseOverWindow(), wie beschrieben. Ich selbst hätte den Mausstatus der Form mit Hilfe der beiden Messages CM_MOUSEENTER und CM_MOUSELEAVE abgefangen sowie dann ebenfalls mittels Timer behandelt, aber die Funktion MouseOverWindow() ist zweifelsohne eleganter.

Sir Rufo 13. Feb 2012 17:16

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von jaenicke (Beitrag 1150860)
Zitat:

Zitat von Sir Rufo (Beitrag 1150849)
Nun ja, so ganz ja nicht, denn die Message
Delphi-Quellcode:
WM_MOUSELEAVE
wird auch dann gesendet, wenn man von der Form auf ein anderes Control wechselt.

Deshalb prüfe ich ja auch die Mausposition um nur beim echten Verlassen zu reagieren. Und MouseMove kommt ja dann bei jeder Bewegung. Sollte doch also passen.

Das funktioniert aber auch nur dann, wenn das Formular nicht von einem anderen überlappt wird ;)

jaenicke 13. Feb 2012 20:19

AW: Ermitteln ob die Maus auf der Form ist?
 
Zitat:

Zitat von ASM (Beitrag 1150863)
Ich selbst hätte den Mausstatus der Form mit Hilfe der beiden Messages CM_MOUSEENTER und CM_MOUSELEAVE abgefangen

Und wo kommen die her?
Richtig, es wird genau das gemacht was ich mache... Beim ersten WM_MOUSEMOVE wird CM_MOUSEENTER ausgelöst, bei WM_MOUSELEAVE wird CM_MOUSELEAVE ausgelöst.

Zitat:

Zitat von Sir Rufo (Beitrag 1150875)
Das funktioniert aber auch nur dann, wenn das Formular nicht von einem anderen überlappt wird ;)

Oh, ja, da hast du Recht. Dann also so:
Delphi-Quellcode:
procedure TForm19.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  ClientRectAbs: TRect;
begin
  if Msg.message = WM_MOUSELEAVE then
  begin
    ClientRectAbs.TopLeft := ClientToScreen(ClientRect.TopLeft);
    ClientRectAbs.BottomRight := ClientToScreen(ClientRect.BottomRight);
    InflateRect(ClientRectAbs, -2, -2);
    if not PtInRect(ClientRectAbs, Mouse.CursorPos) or (WindowFromPoint(Mouse.CursorPos) <> Handle) then
      Color := clBtnFace;
  end
  else if Msg.message = WM_MOUSEMOVE then
    Color := clRed;
end;
Einen Timer braucht man aber trotzdem nicht...

Sir Rufo 13. Feb 2012 21:21

AW: Ermitteln ob die Maus auf der Form ist?
 
Nenn mich Erbsenzähler, aber das gibt ein schönes Geflacker, wenn du mit diesem Code
Delphi-Quellcode:
if not PtInRect(ClientRectAbs, Mouse.CursorPos) or (WindowFromPoint(Mouse.CursorPos) <> Handle) then
über irgendein Control auf der Form entlangfährst. Denn jedes Control hat ein eigenes Handle ;)

Es müsste also die Abfrage aus meiner Funktion - oder einfach die Funktion selber - eingebaut werden :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:18 Uhr.
Seite 3 von 4     123 4      

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