![]() |
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: |
Re: Testen, ob Maus Form verlassen hat
Hallo,
das Abfangen von CM_MouseEnter und CM_MouseLeave ist doch eine gute Basis. Vielleicht könnte man es so machen:
Delphi-Quellcode:
Gruß Hawkeye
type
TForm1 = class (TForm) private procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; end; procedure TForm1.CMMouseEnter(var Message: TMessage); begin if PtInRect(BoundsRect, Mouse.CursorPos) then Color := clBtnFace; end; procedure TForm1.CMMouseLeave(var Message: TMessage); begin if not PtInRect(BoundsRect, Mouse.CursorPos) then Color := clLime; end; |
Re: Testen, ob Maus Form verlassen hat
Danke für eure ganzen vielen Antworten. Ich werde diese noch testen und gucken, was am besten ist.
Tut mir leid, wenn ich mich jetzt erst bedanke, aber ich hatte nicht ganz so viel Zeit. :pale: Ich melde mich dann, wenn ich die ganzen Vorschläge beantwortet hate. Mfg Joe the Junkie |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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