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.