鼠标未离开窗口区域 产生MouseLeave消息
从Cstatic继承的一个类,处理鼠标消息
鼠标未离开窗口区域 产生MouseLeave消息,而且比MouseHover消息产生的更早!
不知道是什么bug。
在mousemove中添加以下代码
if(m_bMouseTrack)
{
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_HOVER|TME_LEAVE;
csTME.hwndTrack = GetSafeHwnd();
csTME.dwHoverTime = HOVER_DEFAULT;
TrackMouseEvent(&csTME);
m_bMouseTrack =false;
}
{
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof(csTME);
csTME.dwFlags = TME_HOVER|TME_LEAVE;
csTME.hwndTrack = GetSafeHwnd();
csTME.dwHoverTime = HOVER_DEFAULT;
TrackMouseEvent(&csTME);
m_bMouseTrack =false;
}
重写
OnMouseHover(UINT nFlags, CPoint point)
{
MessageBox("Hover");
}
{
MessageBox("Hover");
}
重写
OnMouseLeave()
{
MessageBox("Leave");
{
MessageBox("Leave");
m_bMouseTrack = true;
}
}
当鼠标一进入窗口区域,就产生“Leave”,过一会产生“Hover”!
。。。找资料半天没发现为何
我在Static控件里增加了ToolTipCtrl,不知道有没有影响,反正没发现原因。
后来得到的一种方案 重写PreTranslateMessage 在这里面处理就可以,郁闷
不知道哪位路过的指点
PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
// m_ToolTip.RelayEvent(pMsg);
switch( pMsg->message )
{
case WM_MOUSELEAVE:
//此处已经捕捉到WM_MOUSELEAVE消息,你可以写上你的处理代码
MessageBox("leave");
break;
case WM_MOUSEHOVER:
//此处已经捕捉到WM_MOUSEHOVER消息,你可以写上你的处理代码
MessageBox("over");
break;
case WM_MOUSEMOVE:
//为了让系统产生上面的WM_MOUSEHOVER与WM_MOUSEHOVER消息,你必需做如下处理
TRACKMOUSEEVENT trmouse;
trmouse.cbSize = sizeof(TRACKMOUSEEVENT);
trmouse.dwFlags = TME_LEAVE | TME_HOVER;
trmouse.dwHoverTime = 400;
trmouse.hwndTrack = pMsg->hwnd;
if(!_TrackMouseEvent(&trmouse))
return FALSE;
break;
}
return CStatic::PreTranslateMessage(pMsg);
{
// TODO: 在此添加专用代码和/或调用基类
// m_ToolTip.RelayEvent(pMsg);
switch( pMsg->message )
{
case WM_MOUSELEAVE:
//此处已经捕捉到WM_MOUSELEAVE消息,你可以写上你的处理代码
MessageBox("leave");
break;
case WM_MOUSEHOVER:
//此处已经捕捉到WM_MOUSEHOVER消息,你可以写上你的处理代码
MessageBox("over");
break;
case WM_MOUSEMOVE:
//为了让系统产生上面的WM_MOUSEHOVER与WM_MOUSEHOVER消息,你必需做如下处理
TRACKMOUSEEVENT trmouse;
trmouse.cbSize = sizeof(TRACKMOUSEEVENT);
trmouse.dwFlags = TME_LEAVE | TME_HOVER;
trmouse.dwHoverTime = 400;
trmouse.hwndTrack = pMsg->hwnd;
if(!_TrackMouseEvent(&trmouse))
return FALSE;
break;
}
return CStatic::PreTranslateMessage(pMsg);