![]() |
AW: Ermitteln ob die Maus auf der Form ist?
TApplicationEvents auf das Formular --> OnMessage:
Delphi-Quellcode:
Zum Testen schreibt das einfach etwas in die Caption.
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; |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Eine Abfrage würde so aussehen:
Delphi-Quellcode:
und in deinem Projekt dann so:
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;
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; |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
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.
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
Delphi-Quellcode:
wird auch dann gesendet, wenn man von der Form auf ein anderes Control wechselt.
WM_MOUSELEAVE
Wenn die Maus dann passend stehen bleibt, kommt auch kein passendes
Delphi-Quellcode:
.
WM_MOUSEMOVE
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
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. |
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
|
AW: Ermitteln ob die Maus auf der Form ist?
Zitat:
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:
Delphi-Quellcode:
Einen Timer braucht man aber trotzdem nicht...
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; |
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:
über irgendein Control auf der Form entlangfährst. Denn jedes Control hat ein eigenes Handle ;)
if not PtInRect(ClientRectAbs, Mouse.CursorPos) or (WindowFromPoint(Mouse.CursorPos) <> Handle) then
Es müsste also die Abfrage aus meiner Funktion - oder einfach die Funktion selber - eingebaut werden :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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