鼠标未离开窗口区域 产生MouseLeave消息

本文探讨了在Cstatic派生类中实现鼠标Hover与Leave消息处理的问题。通过重写消息处理函数并调整PreTranslateMessage函数,成功解决了消息触发顺序异常的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从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);

转载于:https://www.cnblogs.com/cryinstall/archive/2011/06/10/2077640.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值