5

Я пытаюсь обнаружить вводят/оставляют сообщения CM_MOUSEENTER и CM_MOUSELEAVE, но это не ловить. Что я здесь делаю неправильно?Мышь Ввод/Оставшееся сообщение не работает?

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

Мой первый комментарий не использует контрольные точки для мониторинга такого материала. При переключении в отладчик взаимодействие с UI всегда перепутано. Используйте что-то вроде Codesite, чтобы отправить сообщение в другое окно, и не забудьте изменить фокус во время мониторинга. – mj2008

ответ

7

Я понял мой вопрос: Я также использую WM_NCHITTEST, где я НЕ проходившую inherited;. Я добавил это, и теперь он отлично работает.

+0

'Wm_NCHitTest' кажется, что это не то место для этого. Это сообщение, которое посылает ОС, когда хочет узнать, какую часть элемента управления представляет определенная точка. Это даже не означает, что мышь в данный момент находится на этой точке. Что это связано с проверкой того, что изменилось? Может быть, вы хотите 'wm_MouseMove'? Или просто вызовите 'Invalidate', как только что-то изменится, так что у вас нет проверки позже. –

+0

Это моя собственная внутренняя проверка, это около 30 строк кода, которые проверяют позицию, чтобы увидеть, находится ли она над допустимым положением - именно то, что она должна делать. Я понял, что эта часть не имеет значения, поэтому я исключил ее и заменил ее комментарием. –

+0

Если вы делаете что-то другое, кроме решения о том, какое значение присваивать 'Message.Result', вы делаете это в неправильном обработчике сообщений. Также обратите внимание, что с изменением, которое вы описали в своем ответе, вы вернете только действительное значение для ОС, когда ничего не изменилось. Вы должны просто просто называть «унаследованный» безоговорочно в верхней части функции. Затем вы можете удалить специальное назначение после проверки 'ComponentState' и просто выйти. –

Смежные вопросы