问题背景》
UI逻辑中 经常有这样的应用场景:在鼠标进入窗口区域时做一些操作 离开窗口区域时做一些清理操作
举例:鼠标进入窗口区域时 弹出tooltips 离开窗口区域时 隐藏tooltips
但是OnMouseLeave并不一定就会响应 比如在鼠标进入窗口后 按下鼠标左键并将鼠标移出窗口区域 再松开鼠标 这样的情况下 OnMouseLeave不一定会响应
问题来了:如果有些清理操作 确实需要在鼠标离开窗口区域时去做 该怎么办?
-----------------------------------------------------------------------------------------------------
总结了如下几种解决办法 本文只提出解决方法 每一种都曾应用在我的项目中
至于每种方法的原理 需要大家去学习
一、SetCapture() + ReleaseCapture()
在OnMouseMove中 鼠标进入窗口区域时 调用SetCapture
在OnMouseLeave中 鼠标离开时 调用ReleaseCapture()
二、_TrackMouseEvent
在OnMouseMove中 调用如下代码:
void CMyWnd::OnMouseMove(UINT wParam, CPoint pt)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = HOVER_DEFAULT;
tme.hwndTrack = m_hWnd;
_TrackMouseEvent(&tme);
__super::OnMouseMove(wParam, pt);
}
在OnMouseMove中 鼠标进入窗口区域时 调用SetTimer 启动一个定时器 定时检查鼠标的位置是否还在窗口区域
如果判断到鼠标离开了窗口区域 执行清理操作 并调用KillTimer结束定时器
前两种方法 是为了确保OnMouseLeave一定会被调用 或许有更多的办法 待以后的工作中再慢慢总结