`
blogfeifei
  • 浏览: 1198321 次
文章分类
社区版块
存档分类
最新评论

WM_MOUSELEAVE和WM_MOUSEHOVER使用

 
阅读更多

默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM_MOUSEHOVER 消息的,所以要使用 _TrackMouseEvent 函数来激活这两个消息。调用这个函数后,当鼠标在指定窗口上停留超过一定时间或离开窗口后,该函数会 Post 这两个消息到指定窗口。


使用方法:
1. 在对话框类中定义一个变量来标识是否追踪当前鼠标状态,之所以要这样定义是要避免鼠标已经在窗体之上时,一移动鼠标就不断重复产生 WM_MOUSEHOVER 。
BOOL _bMouseTrack=TRUE ;


2. 在 OnMouseMove 中调用 _TrackMouseEvent 函数
if (_bMouseTrack) // 若允许 追踪,则。
{
TRACKMOUSEEVENT csTME;
csTME.cbSize = sizeof (csTME);
csTME.dwFlags = TME_LEAVE|TME_HOVER;
csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口
csTME.dwHoverTime = 10; // 鼠标在按钮上停留超过 10ms ,才认为状态为 HOVER
::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持


_bMouseTrack=FALSE ; // 若已经 追踪 ,则停止 追踪
}

(#add摘自MSDN:The_TrackMouseEventfunction posts messages when the mouse pointer leaves a window or hovers over a window for a specified amount of time. This function callsTrackMouseEventif it exists, otherwise it emulates it.)
3. 在 OnMouseLeave 中再次允许追踪鼠标状态
_bMouseTrack=TRUE ;


4. 备注:这两个消息的映射要自己写
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

注意:也可以用下面代码在PreTranslateMessage函数中接收,不需要自己写WM_MOUSELEASE和WM_MOUSEHOVER消息的响应函数(当然你要自己写也行):
if(pMsg-> message==WM_MOUSELEAVE)
AfxMessageBox( "mouse leave ");

else if(pMsg->message == WM_MOUSEHOVER)

AfxMessageBos("mouse leave");


return CDialog::PreTranslateMessage(pMsg);

附一个例子:

.h文件加入:
afx_msg LRESULT OnMouseLeave(WPARAM ,LPARAM );
afx_msg LRESULT OnMouseHover(WPARAM ,LPARAM );

.cpp文件加入:
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)


LRESULT CIconButton::OnMouseLeave(WPARAM wParam,LPARAM lParam)
{
InvalidateRect(NULL);
return 0;
}

LRESULT CIconButton::OnMouseHover(WPARAM wParam,LPARAM lParam)
{

//获取鼠标坐标

POINT point;
::GetCursorPos(&point);

ScreenToClient(&point) ;

//亦用如下方法,推荐.OnMouseMove 也可用.

CPoint pt;

pt.x = LOWORD(lParam); // horizontal position of cursor
pt.y = HIWORD(lParam); // vertical position of cursor

//还有如下,和上边其实是一样

POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };


CClientDC dc(this);
CRect rt;
GetClientRect(&rt);
dc.Draw3dRect(0,0,
m_rect.right-m_rect.left,m_rect.bottom-m_rect.top,
RGB(0,0,0),RGB(10,10,10));
return 0;
}


void CIconButton::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CButton::OnMouseMove(nFlags, point);
TRACKMOUSEEVENT tme;
tme.cbSize=sizeof(TRACKMOUSEEVENT);
tme.dwFlags=TME_HOVER | TME_LEAVE;
tme.dwHoverTime=HOVER_DEFAULT;
tme.hwndTrack=m_hWnd;
_TrackMouseEvent(&tme);
}

分享到:
评论

相关推荐

    使托盘图标(TrayIcon)能够响应 WM_MOUSELEAVE消息的代码

    一般的托盘图标是无法获取WM_MOUSELEAVE消息以返回给父窗口的,这段代码通过检测鼠标的位置来判断鼠标指针是否离开当前的托盘图标,从而发送WM_MOUSELEAVE给父窗口。感觉不是很灵敏,但能用。

    [ATL/WTL]_[初级]_[窗口如何实现WM_MOUSELEAVE和WM_MOUSEHOVER]

    http://blog.csdn.net/infoworld/article/details/49718879 WTL响应WM_MOUSELEAVE和WM_MOUSEHOVER

    Window 消息大全

    WM_NOTIFYformAT = $0055 //公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构 在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信 WM_CONTEXTMENU= $007B //...

    VC模仿酷狗7(Kugou7) UI界面源码,有动画效果.rar

    VC模仿酷狗7(Kugou7) UI界面源码,有动画效果,原创作者:...处理WM_MOUSEHOVER、WM_MOUSELEAVE消息,鼠标进入或移出画出不同状态。 注意事项:只是实现初步模拟而已,未响应子控件操作,如果大家有兴趣就接着完善吧。

    VC模仿酷狗7(Kugou7) UI界面源码,有动画效果

    摘要:VC/C++源码,界面编程,仿酷狗,UI,动画窗体 ...处理WM_MOUSEHOVER、WM_MOUSELEAVE消息,鼠标进入或移出画出不同状态。  注意事项:只是实现初步模拟而已,未响应子控件操作,如果大家有兴趣就接着完善吧。

    VC模仿酷狗7动画效果界面

    VC模仿酷狗7动画效果界面,给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow。处理WM_MOUSEHOVER、WM_MOUSELEAVE消息,鼠标进入或移出画出不同状态。

    易语言酷狗源码

    给窗口加上WS_EX_LAYERED样式,使用Gdiplus画出图片,然后UpdateLayeredWindow。处理WM_MOUSEHOVER、WM_MOUSELEAVE消息,鼠标进入或移出画出不同状态。 只是实现初步模仿而已,如果大家有兴趣就接着完善吧。

    PLC 编译器 用于转换梯形图

    // ON_WM_MOUSELEAVE() ON_WM_NCMOUSELEAVE() END_MESSAGE_MAP() BEGIN_DISPATCH_MAP(VDisPlayView, CScrollView) END_DISPATCH_MAP() // Note: we add support for IID_IViScroll to support typesafe binding /...

    mouseleave事件不正常

    我准备在winform界面中实现鼠标跟踪的功能,就是当鼠标移到picturebox控件上时,改变picturebox控件边框样式,移出控件后改回来,我是用mouseenter和mouseleave事件实现该功能的,但是我发现mouseleave事件不能正常...

    WPF实现半圆形导航菜单

    本文实例为大家分享了WPF实现半圆形导航菜单的...<Grid x:Name=mainGrid MouseEnter=MainGrid_MouseEnter MouseLeave=MainGrid_MouseLeave> <Path x:Name=sectorPath Data=M 200,200 0,200 A 200,200 0 0 1 58.6,5

    实例讲解jquery中mouseleave和mouseout的区别

    本文详细的介绍了关于jQuery中mouseleave和mouseout的区别,分享给大家供大家参考,具体内容如下 很多人在使用jQuery实现鼠标悬停效果时,一般都会用到mouseover和mouseout这对事件。而在实现过程中,可能会出现一些...

    详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法

    主要介绍了详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    jquery中的mouseleave和mouseout的区别 模仿下拉框效果

    只有在鼠标指针离开被选元素时,才会触发 mouseleave 事件。 代码如下: ”sel_box”> <input type=”button” value=”请选择所属部门” id=”sel_dept” /> ”hide” id=”sel_dept_sh” xss=removed> <p> ...

    控件开发基础.rar

     还要定义两个接收Windows消息CM_MOUSEENTER和CM_MOUSELEAVE(鼠标移进和移出)的过程:  Procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;  Procedure CMMouseLeave(var Message: ...

    为非IE浏览器添加mouseenter,mouseleave事件

    NULL 博文链接:https://snandy.iteye.com/blog/793531

    VB子类化按钮(Vista样式,无图片)

    VB子类化按钮,Vista样式,无图片,绘制了MouseHover和MouseLeave事件.

    AngularJS基础 ng-mouseleave 指令详解

    AngularJS ng-mouseleave 指令 AngularJS 实例 在鼠标指针离开元素时执行表达式: <!DOCTYPE html> <html> <head> <meta charset=utf-8> [removed][removed] </head> <body ng-app...

    关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别

    mouseover ,mouseout ,mouseenter,mouseleave,都是鼠标点击而触发的事件,各自代表什么意思,有哪些区别呢?下面跟着脚本之家小编一起看看吧

Global site tag (gtag.js) - Google Analytics