5

Ich versuche, Maus eingeben/lassen Nachrichten CM_MOUSEENTER und CM_MOUSELEAVE zu erkennen, aber es ist nicht abzufangen. Was mache ich hier falsch?Maus Geben/Lassen Sie Nachrichten nicht funktionieren?

type 
    TMyControl = class(TCustomControl) 
    private 
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; 
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 
    end; 

procedure TMyControl.CMMouseEnter(var Message: TMessage); 
begin 
    //Handle mouse entering 
    //Breakpoint never reached, procedure never called 
end; 

procedure TMyControl.CMMouseLeave(var Message: TMessage); 
begin 
    //Handle mouse leaving 
    //Breakpoint never reached, procedure never called 
end; 

procedure TMyControl.WMNCHitTest(var Message: TWMNCHitTest); 
var 
    Ch: Bool; 
begin 
    if csDesigning in ComponentState then 
    Message.Result := HTCLIENT 
    else begin 
    Ch:= False; 

    //Do checks and pass `Ch:= True;` if something changed... 

    if Ch then Invalidate; 
    end; 
end; 
+1

Mein erster Kommentar ist, verwenden Sie keine Haltepunkte für die Überwachung solcher Sachen. UI-Interaktion ist immer gestört, wenn Sie in den Debugger wechseln. Verwenden Sie etwas wie Codesite, um eine Nachricht an ein anderes Fenster zu senden, und achten Sie darauf, während der Überwachung den Fokus nicht zu ändern. – mj2008

Antwort

7

dachte ich, mein Problem aus: Ich bin mit WM_NCHITTEST auch, wo ich nicht inherited; vorging. Ich habe das hinzugefügt, und jetzt funktioniert es gut.

+0

'Wm_NCHitTest' scheint wie der falsche Ort dafür sowieso. Es ist eine Nachricht, die das Betriebssystem sendet, wenn es wissen möchte, welcher Teil eines Steuerelements ein bestimmter Punkt darstellt. Es bedeutet nicht einmal, dass die Maus gerade * auf * diesem Punkt ist. Was hat das damit zu tun, zu überprüfen, ob sich etwas geändert hat? Vielleicht möchtest du 'wm_MouseMove'? Oder rufen Sie einfach 'Invalidate' auf, sobald sich etwas ändert, sodass Sie später keine Kontrolle mehr haben. –

+0

Es ist meine eigene interne Überprüfung, es sind etwa 30 Zeilen Code, der die Position überprüft, um zu sehen, ob sie sich über einer gültigen Position befindet - genau, was sie tun soll. Ich fand, dass dieser Teil irrelevant war, also habe ich ihn ausgeschlossen und durch einen Kommentar ersetzt. –

+0

Wenn Sie etwas anderes tun, als zu entscheiden, welchen Wert Sie "Message.Result" zuweisen möchten, tun Sie dies im falschen Nachrichtenhandler. Beachten Sie außerdem, dass Sie mit der Änderung, die Sie in Ihrer Antwort beschrieben haben, nur dann einen gültigen Wert an das Betriebssystem zurückgeben, wenn sich nichts geändert hat. Sie sollten einfach nur bedingungslos am Anfang der Funktion "geerbt" nennen. Dann können Sie die spezielle Zuweisung nach dem Überprüfen von 'ComponentState' entfernen und stattdessen einfach beenden. –

Verwandte Themen