Einzelnen Beitrag anzeigen

ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#33

AW: Ermitteln ob die Maus auf der Form ist?

  Alt 13. Feb 2012, 23:29
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.
  Mit Zitat antworten Zitat