![]() |
Testen, ob Maus Form verlassen hat
Hallo,
Ich hab mal eben ne Frage. Wie kann ich testen, ob die Maus die Form verlassen hat? Vielen Dank im Vorraus. :-D |
Re: Testen, ob Maus Form verlassen hat
Hallo,
in einem etwas älteren Projekt habe ich das mal so gelöst:
Delphi-Quellcode:
Also per TTimer. Den Interval hatte ich auf 50 stehen.
procedure TForm1.Timer1Timer(Sender: TObject);
begin Timer1.Enabled := false; if (Mouse.CursorPos.X > (Form1.Left + Form1.Width)) or (Mouse.CursorPos.X < Form1.Left) or (Mouse.CursorPos.Y > (Form1.Top + Form1.Height)) or (Mouse.CursorPos.Y < Form1.Top) then MessageDlg('Erwischt', mtInformation, [mbOk], 0); Timer1.Enabled := true; end; Geht aber bestimmt eleganter per Mouse-Hook. |
Re: Testen, ob Maus Form verlassen hat
Hallo,
probiere es einmal mit
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } public { Public-Deklarationen } procedure WndProc(var Msg: TMessage); override; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WndProc(var Msg: TMessage); begin inherited; if Msg.Msg = CM_MOUSELEAVE then begin //DO SOMETHING end; end; end. |
Re: Testen, ob Maus Form verlassen hat
Zitat:
Delphi-Quellcode:
Anmerkung: CM_MOUSELEAVE wird nicht immer erzeugt, wenn Du sehr schnell mit der Maus aus dem Fenster gehst. :-(
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private-Deklarationen } procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER; procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } procedure TForm1.MouseEnter(var Msg: TMessage); begin Color := clGreen; end; procedure TForm1.MouseLeave(var Msg: TMessage); begin Color := clRed; end; end. |
Re: Testen, ob Maus Form verlassen hat
Zitat:
|
Re: Testen, ob Maus Form verlassen hat
Zitat:
|
Re: Testen, ob Maus Form verlassen hat
Delphi-Quellcode:
Sollte das nicht reichen? (ungetestet)
function MouseIn(rect: TRect): Boolean; overload;
function MouseIn(Ctrl: TControl): Boolean; function MouseIn(rect: TRect): Boolean; begin Result := (Mouse.CursorPos.X >= rect.left) and (Mouse.CursorPos.X <= rect.right ) and (Mouse.CursorPos.Y >= rect.top) and (Mouse.CursorPos.Y <= rect.bottom ); end; function MouseIn(Ctrl: TControl): Boolean; begin Result := MouseIn(rect(Ctrl.ClientToScreen(0),Ctrl.ClientToScreen(0),Ctrl.ClientToScreen(Ctrl.Width),Ctrl.ClientToScreen(Ctrl.Height))); end; |
Re: Testen, ob Maus Form verlassen hat
Zitat:
|
Re: Testen, ob Maus Form verlassen hat
Zitat:
wenn die Maus genau dann über die Form "rennt" während das Timerergniss nicht arbeitet bzw. in dem moment wo die IF-Abfrage läuft würde nicht erkannt werden das die Maus über der Form gewesen ist. |
Re: Testen, ob Maus Form verlassen hat
Zitat:
Immerhin: Zumindest wird bei mir (falls es wirklich einer schaffen sollte) nach spätestens 50ms das Überschreiten der Grenzen erkannt. Wenn das mit "zu schnell" bei CM_MOUSELEAVE passiert, wird IMHO gar nix ausgelöst... Gibt es für dieses Problem wirklich keine saubere und 100% Lösung? :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 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