5

Tôi đang cố gắng phát hiện các thông báo nhập/rời chuột CM_MOUSEENTERCM_MOUSELEAVE nhưng không bắt được. Tôi làm gì sai ở đây?Chuột Enter/Leave tin nhắn không hoạt động?

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

Nhận xét đầu tiên của tôi không sử dụng điểm ngắt để theo dõi các nội dung như vậy. Giao diện người dùng tương tác luôn được điều chỉnh khi bạn chuyển sang trình gỡ lỗi. Sử dụng một cái gì đó như Codesite để gửi một tin nhắn đến một cửa sổ khác, và chắc chắn không thay đổi tiêu điểm trong khi theo dõi. – mj2008

Trả lời

7

tôi đã tìm ra vấn đề của tôi: Tôi cũng đang sử dụng WM_NCHITTEST, nơi tôi đã đi qua KHÔNG inherited;. Tôi đã thêm vào, và bây giờ nó hoạt động tốt.

+0

'Wm_NCHitTest' có vẻ như là địa điểm sai. Đó là thông báo mà hệ điều hành gửi khi muốn biết phần nào của điều khiển mà một điểm nhất định đại diện. Nó thậm chí không có nghĩa là con chuột hiện tại * trên * điểm đó. Điều đó có liên quan gì đến việc kiểm tra liệu có gì thay đổi không? Có lẽ bạn muốn 'wm_MouseMove'? Hoặc chỉ cần gọi 'Invalidate' ngay khi có gì đó thay đổi, vì vậy bạn không có kiểm tra sau này. –

+0

Đó là kiểm tra nội bộ của riêng tôi, đó là khoảng 30 dòng mã mà là kiểm tra vị trí để xem nếu nó là trên một vị trí hợp lệ - chính xác những gì nó có nghĩa là để làm. Tôi nghĩ rằng một phần là không liên quan nên tôi đã loại bỏ nó và thay thế bằng một bình luận. –

+0

Nếu bạn đang làm một cái gì đó khác hơn là quyết định giá trị để gán cho 'Message.Result', thì bạn đang làm điều đó trong trình xử lý tin nhắn sai. Ngoài ra, hãy lưu ý rằng với thay đổi bạn đã mô tả trong câu trả lời của mình, bạn sẽ chỉ trả lại giá trị hợp lệ cho Hệ điều hành khi không có gì thay đổi. Bạn nên xem xét chỉ cần gọi 'thừa hưởng 'vô điều kiện ở phía trên cùng của hàm. Sau đó, bạn có thể loại bỏ nhiệm vụ đặc biệt sau khi kiểm tra 'ComponentState' và chỉ cần thoát ra để thay thế. –

Các vấn đề liên quan