在MFC中当鼠标停留在程序窗口一定时间后,会产生一个WM_MOUSEHOVER
消息;当鼠标离开程序窗口后,会产生一个WM_MOUSELEAVE
消息。MFC为我们提供了OnMouseHover()
和OnMouseLeave()
两个函数来分别响应鼠标停留一段时间和鼠标离开对话框/控件的消息。
但是默认情况下控件是不发送这两个消息的,所以直接在类属性中添加这两个处理函数是无法正常被调用的。需要通过_TrackMouseEvent
才可以将这两个消息发送出去。
使用方法
- 在需要被操作的控件中声明一个成员变量
m_is_track
,并初始化为false.当鼠标进入控件时置为true,离开控件时置为false。 - 在控件的添加OnMouseMove()函数,并调用
_TrackMouseEvent
函数。void CBaseControl::OnMouseMove(UINT nFlags, CPoint point) { if(!m_is_track) { TRACKMOUSEEVENT csTME; csTME.cbSize = sizeof (csTME); csTME.dwFlags = TME_LEAVE|TME_HOVER; //需要发送的消息,可选 csTME.hwndTrack = GetSafeHwnd(); ;// 指定要 追踪 的窗口 csTME.dwHoverTime = 100; // HOVER消息触发时间 单位ms ::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持 m_is_track=ture; //避免重复执行 } CWnd::OnMouseMove(nFlags, point); }
- 在
OnMouseLeave()
函数中将m_is_track
置为false。
题外话
通过以上操作就可以让控件响应鼠标停留和离开消息了,事实上我们可以将 if 函数中的代码写进虚函数OnTrack()中,这样子类就可以通过重写OnTrack()函数来实现响应鼠标的进入事件了,不要忘了调用父类的OnTrack()函数。