WM_MOUSEHOVER/WM_MOUSELEAVE

来源:互联网 发布:python运维框架 编辑:程序博客网 时间:2024/06/07 09:49

程序要检测到鼠标进入或离开了窗口,需要用到WM_MOUSEHOVER和WM_MOUSELEAVE消息。

VC默认是不产生这两个消息的,它们必须使用_TrackMouseEvent产生。方法是:

1、响应WM_MOUSEMOVE消息,在其中

            if (!m_bEnter)// 必须定义一个鼠标进入或离开的标志,否则在MOUSEMOVE的时候,程序总不停的调用_TrackMouseEvent
            {
                TRACKMOUSEEVENT    track;
                ZeroMemory(&track, sizeof(TRACKMOUSEEVENT));
                track.cbSize = sizeof(TRACKMOUSEEVENT);
                
                track.hwndTrack = m_hWnd;
                track.dwFlags = TME_LEAVE;
                track.dwHoverTime = HOVER_DEFAULT;
                
                _TrackMouseEvent(&track);
                
                m_bEnter = TRUE;
            }

注:本段程序必须放在消息处理中进行,而不能放在别处例如初始化时,只调用一次

2、处理WM_MOUSELEAVE

            POINT   pt;
            GetCursorPos(&pt);

            CRect rect;
            GetClientRect(&rect);
            
            ClientToScreen(rect);

            if (!rect.PtInRect(pt))
            {
                m_tooltipWnd.ShowWindow(SW_HIDE);
            }
            m_bEnter = FALSE;

注:之所以还要判断pt是否在rect中,是因为_TrackMouseEvent有个bug,当鼠标进入到窗口上的某个控件上方的时候,它也认为mouseleave了

原创粉丝点击