默认情况下,窗口是不响应WM_MOUSEHOVER 和 WM_MOUSELEAVE (这个消息上次测试是默认下也响应的)消息的。
所以需要调用 ::_TrackMouseEvent 函数来激活这两个消息。
WM_MOUSEHOVER 是调用::_TrackMouseEvent (当次设置后有效) 当鼠标在指定的窗口上停留超过一定时间后;
WM_MOUSELEAVE 是鼠标离开指定窗口后 ,
该函数Post 这两个消息到指定窗口.
使用详解 :
typedef struct tagTRACKMOUSEEVENT{
DWORD cbSize ; // 结构体大小
DWORD swFlags ; //定义服务请求 可以下 下面组合 : TME_CANCEL 是取消前一次的跟踪请求 如 TME_CANCEL | TME_HOVER ,
TME_HOVER 是当鼠标停留在指定的窗口上面做出响应 ,
TME_LEAVE 是当鼠标离开指定的窗口做出的响应 ,等等
HWND hwndTrack ; // 待跟踪的窗口句柄;
DWORD dwHoverTime ; //定义hover 时间的耗尽时间(如果在dwFlags 中有TME_HOVER ),单位毫秒 ;
} TRACKMOUSEEVENT , *LPTRAKMOUSEEVENT;
在OnMouseMove () 中设置响应 :
void CSuperButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//MessageBox(L"MouseMove in this Button");
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_HOVER;
csTME.hwndTrack = m_hWnd;
csTME.dwHoverTime = 2000;
::_TrackMouseEvent(&csTME);
//m_bMouseTrack = FALSE;
CButton::OnMouseMove(nFlags, point);
}
在OnMouseHover () 中响应 :
void CSuperButton::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
MessageBox(_T("MouseHover"));
//再次设计WM_HOVER 消息响应
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_HOVER;
csTME.hwndTrack = m_hWnd;
csTME.dwHoverTime = 2000;
::_TrackMouseEvent(&csTME);
CButton::OnMouseHover(nFlags, point);
}