TrackMouseEvent函数实现鼠标停留响应

TrackMouseEvent函数在鼠标离开某一窗口或在某一窗口上停留超过某一特定时间长度时发送消息。

原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);
参数:
  lpEventTrack:是一个指向TRACKMOUSEEVENT结构体的指针。
返回: 成功的话返回非零值(true),否则返回零(false)。

该函数可以发送的消息包括:(WM_MOUSEHOVER,WM_MOUSELEAVE)
  WM_MOUSEHOVER:
    鼠标在窗口的某一客户区上停留上一次调用TrackMouseEvent函数时所设定的时间长度时发送。在该消息产生之后将停止跟踪,如果需要进一步跟踪鼠标的停留事件,必须再次调用TrackMouseEvent函数。

  WM_MOUSELEAVE:
    当鼠标离开前一次调用TrackMouseEvent函数所设定的窗口的客户区时发送该消息。在产生该消息时,所有由TrackMouseEvent请求的跟踪都将被取消。如果需要对鼠标的hover事件进行进一步的跟踪,必须在鼠标重新进入窗口里再次调用TrackMouseEvent函数。

TRACKMOUSEEVENT结构体:
其定义如下:
typedef struct tagTRACKMOUSEEVENT
{
    DWORD cbSize;
    DWORD dwFlags;
    HWND  hwndTrack;
    DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

几个成员的含义:
   cbSize: 定义TRACKMOUSEEVENT结构体的大小;
   dwFlags:定义服务请求,可以是下列值的组合:
        TME_CANCEL: 取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型,例如要取消hover跟踪,就必须同时传送TME_CANCEL和TME_HOVER(TME_CANCEL|TME_HOVER)。
        TME_HOVER : hover通知。可以发送WM_MOUSEHOVER消息。如果在hover跟踪处于激活状态时再次请求hover跟踪的话,hover的定时器将被重置。
        TME_LEAVE : 鼠标离开。发送TME_MOUSELEAVE消息。当鼠标不在指定的窗口或区域上时,将立即产生一个leave通知,不再做任何跟踪。
        TME_QUERY : 这一项不是作为跟踪请求的。选中这一项时,当结构体被传送给TrackMouseEvent函数时,即产生当前跟踪。唯一不同的是返回的消耗时间,是真实的消耗时间而不是HOVER_DEFAULT,即使之前TrackMouseEvent函数所请求的是HOVER_DEFAULT。
   hwndTrack: 待跟踪窗口的句柄
   dwHoverTime: 定义hover事件的耗尽时间(如果在dwFlags中有定义TME_HOVER的话),单位毫秒。

    可以使用HOVER_DEFAULT来使用系统默认的hover事件耗尽时间。
    系统默认的hover事件耗尽时间为菜单下拉时间,即400毫秒。可以调用SystemParameterInfo函数并使用SPI_GETMOUSEHOVERTIME来获取默认的hover耗尽时间。
    默认的hover矩形区与双击区一致。可以调用SystemParameterInfo并使用SPI_GETMOUSEHOVERWIDTH和SPI_GETMOUSEHOVERHEIGHT来获取鼠标在上面停留可以产生WM_MOUSEHOVER的区域。

问题:
    有一个小问题。前面一直都说的是TrackMouseEvent函数,但实在上,在程序中,如果直接使用TrackMouseEvent(&tme);时,会出现诸如“'TrackMouseEvent' : undeclared identifier”的错误。但如果你使用_TrackMouseEvent(&tme);就不会有错误了。为什么呢?
   1.在stdafx.h 最开头加一句  #define   _WIN32_WINNT   0x0500
   2.使用这个_TrackMouseEvent这个函数名称

分析:
    这两个函数的区别,TrackMouseEvent函数的头文件是winuser.h,对应的库文件为user32.lib,而_TrackMouseEvent函数则在commctrl.h里定义,而由COMCTRL32.DLL导出。
    使用TrackMouseEvent函数必须用extern "C"导入此函数。
    如下:extern  "C"  WINUSERAPI  BOOL  WINAPI  TrackMouseEvent  (LPTRACKMOUSEEVENT  lpEventTrack);

  
NOTE由上面说到的TrackMouseEvent函数的特点,通常都在OnMouseMove函数里添加该函数。另外,可以与SetCapture函数联合使用,即使在鼠标移出窗口区时也能够响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值