WM_MOUSEHOVER/WM_MOUSELEAVE

程序要检测到鼠标进入或离开了窗口,需要用到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了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值