Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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 21:54

AW: Ermitteln ob die Maus auf der Form ist?
 
Stimmt. Darauf habe ich jetzt nicht geachtet, weil ich mich gerade sehr an dem Timer gestört hatte.

Sir Rufo 13. Feb 2012 22:01

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

Zitat von jaenicke (Beitrag 1150917)
Stimmt. Darauf habe ich jetzt nicht geachtet, weil ich mich gerade sehr an dem Timer gestört hatte.

Macht nix, the knight is watching you :cyclops:

ASM 13. Feb 2012 22:29

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

Zitat von jaenicke (Beitrag 1150902)
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.
[/DELPHI]

Obwohl inzwischen ja alles mit der Funktion MouseOverWindow() sehr einfach und bestens gelöst ist, hier doch noch meine Antwort auf die Frage.
Da kommen sie her (komplettes Beispiel):
Code:
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Timer1: TTimer;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  protected
  private
    { Private-Deklarationen }
    isMouseOnForm: Boolean;
    changed: Boolean;
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
  public
    { Public-Deklarationen }
  end;
 
  Implementation
 
  const
    cMouseOnForm = 'Mouse on form';
    cMouseOutOfForm = 'Mouse outside of form';
 
  procedure TForm1.CMMouseEnter(var msg: TMessage);
  begin
    isMouseOnForm := true;
    label1.caption := cMouseOnForm;
    changed := true;
  end;
 
  procedure TForm1.CMMouseLeave(var msg: TMessage);
  begin
    isMouseOnForm := false;
    label1.caption := cMouseOutOfForm;
    changed := true;
  end;
 
  procedure TForm1.FormCreate(Sender: TObject);
  begin
    panel1.Caption := '';
    label1.Caption := '';
    timer1.interval := 100; // oder nach Bedarf
  end;
 
  procedure TForm1.Timer1Timer(Sender: TObject);
  begin
    // "changed"- Abfrage nur, um unnötige Aktionen zu vermeiden
    if changed then
    begin
      changed := false;
      label1.invalidate;
      // oder was auch immer nötig:
      if isMouseOnForm then MachDies()
      else MachDas();
    end;
  end;
Und damit funktioniert es - anders als mit dem ApplicationEvent - perfekt auch unter Delphi 7, und zudem wird auch die Kopfzeile der Form als Bestandteil der Form erkannt, und es ist egal, ob und welche Komponente (z.B. ein Panel) auf der Form plaziert ist.

EWeiss 13. Feb 2012 22:48

AW: Ermitteln ob die Maus auf der Form ist?
 
Warum nicht einfach WindowFromPoint ?

GetCursorPos in verbindung mit WindowFromPoint
Wenn beim Loslassen des Button (oder was auch immer ein HWND/THandle besitzt)

das HWND vom WindowFromPoint das gleiche wie mein Handle des Button ist
Ergebnis true andernfalls false

UPS:
Sehe gerade hatte Sir Rufo ja schon geschrieben.

gruss

Popov 14. Feb 2012 02:33

AW: Ermitteln ob die Maus auf der Form ist?
 
Probier das mal aus. Sollte eigentlich das sein was du brauchst:

Delphi-Quellcode:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
  ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if GetCapture = 0 then
    SetCapture(Handle);

  if PtInRect(BoundsRect, ClientToScreen(Point(x, y))) then
    Caption := 'Maus ist über der Form'
  else
    Caption := 'Maus ist außerhalb der Form';
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:51 Uhr.
Seite 4 von 4   « Erste     234   

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