鼠标未离开窗口区域 产生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;
}

重写

OnMouseHover(UINT nFlags, CPoint point)
{
MessageBox(
"Hover");
}

重写

OnMouseLeave()
{
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);
posted @ 2011-06-10 14:59  Livesss  阅读(1346)  评论(0编辑  收藏  举报