响应WM_MOUSEHOVER和WM_MOUSELEAVE

来源:互联网 发布:Php 微信众筹系统 编辑:程序博客网 时间:2024/05/17 23:54

本人使用的版本VS2010

有时候我们会在控件继承类的时候为控件添加鼠标进入和离开的事件。

1.下面首先添加这2个事件同时也添加WM_MOUSEMOVE事件,注意,不是WM_NCMOUSEHOVER和WM_NCMOUSELEAVE,

里面的NC全称为nonclient area,指的是非工作区。

 

2.创建并在WM_MOUSEMOVE事件调用以下这个函数,函数名不唯一

void CMyXXX::TraceMouseEvent()
{
 TRACKMOUSEEVENT tEventTrack = {0};
 tEventTrack.cbSize = sizeof(tEventTrack);
 tEventTrack.dwFlags = TME_HOVER|TME_LEAVE;
 tEventTrack.dwHoverTime = 1;
 tEventTrack.hwndTrack = GetSafeHwnd();
  _TrackMouseEvent(&tEventTrack);
}

以上就能响应WM_MOUSEHOVER和WM_MOUSELEAVE事件了。

 

在这个前提做一下判别优化,直接贴以下代码了。

 

BOOL bMouseTrack=TRUE;

void BEdit::OnMouseHover(UINT nFlags, CPoint point)
{
 //添加你的事件
CEdit::OnMouseHover(nFlags, point);
}


void BEdit::OnMouseLeave()
{
bMouseTrack=TRUE;

//添加你的事件
 CEdit::OnMouseLeave();
}


void BEdit::OnMouseMove(UINT nFlags, CPoint point)
{
if (bMouseTrack)  
{
  TraceMouseEvent();
}
CEdit::OnMouseMove(nFlags, point);
}

void BEdit::TraceMouseEvent()
{
TRACKMOUSEEVENT tEventTrack = {0};
tEventTrack.cbSize = sizeof(tEventTrack);
tEventTrack.dwFlags = TME_HOVER|TME_LEAVE;
tEventTrack.dwHoverTime = 2;
tEventTrack.hwndTrack = GetSafeHwnd();
BOOL bRet = _TrackMouseEvent(&tEventTrack);
bMouseTrack=FALSE;   //若已经追踪,则停止追踪
}

 

 

0 0