2016-04-01 12 views
3

Ich mache eine Test-VCL-App mit Delphi. Ich habe ein leeres Formular mit einem Label und ich ändere diesen Label-Wert mit dem Formular FormMouseLeave Ereignis. Es funktioniert, aber wenn ich beim Verlassen des Formulars die linke Maustaste gedrückt halte, wird das Ereignis nicht ausgelöst.MouseLeave Ereignis funktioniert nicht mit gedrückten Linksklick

Ich habe versucht, abfangen die WM_MOUSELEAVE Nachricht, sieht aber seine durchaus nicht ausgelöst (na ja, ich denke FormMouseLeave Ereignis auf diese Nachricht basiert)

Ich brauche keine Drag & Drop triggern, ich meine gerade brauchen Ereignis wenn die Maus mein Formular mit gedrückter linker Maustaste verlässt, wie kann ich das machen?

Antwort

4

Dies ist bekannt Verhalten von WM_MOUSELEAVE Nachricht. Sie können es umgehen, indem Sie die Mausbewegung verfolgen, und wenn die Maus die Grenzen verlässt, können Sie das Ereignis selbst auslösen.

Wenn Sie die Maustaste gedrückt haben, hat Ihr Fenster (Formular) die Maus erfasst und WM_MOUSEMOVE Ereignisse erhalten, auch wenn die Maus außerhalb der Grenzen ist. WM_MOUSELEAVE Nachricht ist zum Verfolgen der Maus in Ihrem Fenster gedacht, wenn Sie keine Maus erfasst haben.

Wenn Sie MouseEnter, MouseLeave und MouseMove Ereignisse zu Ihrem Formular zuweisen Sie so etwas wie folgendes tun:

procedure TForm1.FormMouseEnter(Sender: TObject); 
begin 
    Label1.Caption := ''; 
end; 

procedure TForm1.FormMouseLeave(Sender: TObject); 
begin 
    Label1.Caption := 'left'; 
end; 

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    if not PtInRect(ClientRect, TPoint.Create(x, y)) then Label1.Caption := 'left move'; 
end; 
4

Wenn die linke Taste untergeht, fängt der VCL-Framework mit der Maus, wenn die Steuerung der Unterseite der Maus hat csCaptureMouse in seinem Kontrollstil. Wenn die Maus erfasst wird, werden die Nachrichten WM_MOUSELEAVE nicht generiert, bis die Erfassung freigegeben wird. Das passiert, wenn der linke Knopf hochgeht.

Wenn Sie csCaptureMouse von der Steuerung unter der Maus entfernt haben, dann würde WM_MOUSELEAVE Nachricht generiert werden, sobald die Maus das Fenster verließ, weil die Maus nicht erfasst worden wäre.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ControlStyle := ControlStyle - [csCaptureMouse]; 
end; 

Natürlich ist das Ändern dieses Stils, nur um diesen Effekt zu erzielen, sicherlich nicht das, was Sie tun sollten. Ich möchte nur darauf hinweisen, dass das Problem auf eine Interaktion zwischen Mauserfassung und Mausverfolgung zurückzuführen ist.

Aber Maus-Tracking und WM_MOUSELEAVE sind nicht wirklich das, was Sie suchen, denke ich. Die WM_MOUSELEAVE wird ausgelöst, wenn Sie die Maus über die Steuerelemente auf Ihrem Formular bewegen, was sicherlich nicht das ist, was Sie wollen.

Also denke ich, dass der in Dalijas Antwort skizzierte Ansatz in jedem Fall der richtige Weg ist, Ihr gewünschtes Verhalten in jedem Fall umzusetzen, unabhängig davon, ob die Maustaste gedrückt ist oder nicht.

Verwandte Themen