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

你可能感兴趣的:(EL)