[MFC] 无法响应OnMouseLeave事件的若干种解决办法
2017-03-05 16:49
302 查看
问题背景》
UI逻辑中 经常有这样的应用场景:在鼠标进入窗口区域时做一些操作 离开窗口区域时做一些清理操作
举例:鼠标进入窗口区域时 弹出tooltips 离开窗口区域时 隐藏tooltips
但是OnMouseLeave并不一定就会响应 比如在鼠标进入窗口后 按下鼠标左键并将鼠标移出窗口区域 再松开鼠标 这样的情况下 OnMouseLeave不一定会响应
问题来了:如果有些清理操作 确实需要在鼠标离开窗口区域时去做 该怎么办?
-----------------------------------------------------------------------------------------------------
总结了如下几种解决办法 本文只提出解决方法 每一种都曾应用在我的项目中
至于每种方法的原理 需要大家去学习
一、SetCapture() + ReleaseCapture()
在OnMouseMove中 鼠标进入窗口区域时 调用SetCapture
在OnMouseLeave中 鼠标离开时 调用ReleaseCapture()
二、_TrackMouseEvent
在OnMouseMove中 调用如下代码:
三、SetTimer + KillTimer
在OnMouseMove中 鼠标进入窗口区域时 调用SetTimer 启动一个定时器 定时检查鼠标的位置是否还在窗口区域
如果判断到鼠标离开了窗口区域 执行清理操作 并调用KillTimer结束定时器
前两种方法 是为了确保OnMouseLeave一定会被调用 或许有更多的办法 待以后的工作中再慢慢总结
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); }
三、SetTimer + KillTimer
在OnMouseMove中 鼠标进入窗口区域时 调用SetTimer 启动一个定时器 定时检查鼠标的位置是否还在窗口区域
如果判断到鼠标离开了窗口区域 执行清理操作 并调用KillTimer结束定时器
前两种方法 是为了确保OnMouseLeave一定会被调用 或许有更多的办法 待以后的工作中再慢慢总结
相关文章推荐
- 页面加UIPanGestureRecognizer手势后,无法响应tableViewCell点击事件的解决办法
- Gridview Row事件响应方法无法获取其它UpdatePanel中控件数据的解决办法
- 关于XTToolkitPro中DialogPanes无法响应OnDockingPaneNotify事件的解决办法。
- UIScrollView无法响应touch事件的解决办法
- 网页脚本中无法响应ATL事件的解决办法
- 『IOS』UIScrollView无法响应touch事件的解决办法
- 进行animation时点击事件无法响应的解决办法(animation进行时默认是禁止交互)
- 关于XTToolkitPro中DialogPanes无法响应OnDockingPaneNotify事件的解决办法
- 页面加UIPanGestureRecognizer手势后,无法响应tableViewCell点击事件的解决办法
- iOS11自定义导航栏标题,位置有偏差并且无法响应点击事件和手势的解决办法(Swift)
- UIScrollView无法响应touch事件的解决办法
- bsf窗口无法正常闪动和任务栏事件响应的解决办法
- UIScrollView无法响应touch事件的解决办法
- Silverlight Canvas 无法响应KeyDown事件解决办法
- 网页脚本中无法响应ATL事件的解决办法
- MFC对话框里不能响应按键事件的解决办法
- DUI 响应选择行事件后,在本行再次点击无法响应选择行事件的解决办法
- Android 关于嵌套listView时onItemClick事件不响应的解决办法
- JS调用form的方法submit直接提交form的时候,submit事件不响应解决办法
- 【VC MFC开发】Dll 中对话框的控件无法接受到按键消息的解决办法