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