TrackMouseEvent与_TrackMouseEvent

转载自:http://blog.csdn.net/hywqc888/article/details/6689538

函数功能:当在指定时间内鼠标指针离开或盘旋在一个窗口上时,此函数寄送消息。

  函数原型:BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);

  参数:

  lpEventTrack;指向结构TRACKMOUSEEVENT的指针。

  返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

  此函数能寄送如下消息:

  WM_MOUSEHOVER:在调用TrackMouseEvent后指定的时间里,鼠标仍盘旋在窗口的客户区,此消息产生,盘旋跟踪停止。如果需要进一步的鼠标盘旋跟踪,应用程序应当再次调用TrackMouseEvent。

  WM_MOUSELEAVE:在调用TrackMouseEvent后,鼠标离开参数TRACKMOUSEEVENT结构指定的窗口客户区时,此消息产生,所有由TrackMouseEvent要求的跟踪都被取消。当鼠标再次进入窗口,并且要求进一步的鼠标盘旋跟踪时,应用程序必须调用TrackMouseEvent。

  该处使用自定义消息发送形式:

  ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)

  ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover)

注意:WM_MOUSELEAVE响应函数为 void OnMouseLeave(WPARAM wp,LPARAM lp),若写成 void OnMouseLeave(),Release下运行会出现错误。

TRACKMOUSEEVENT结构体
TRACKMOUSEEVENT结构体在TrackMouseEvent函数中用到。
其定义如下:
typedef struct tagTRACKMOUSEEVENT {
    DWORDcbSize;
    DWORDdwFlags;
   HWND  hwndTrack;
    DWORDdwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
 
几个成员的含义:
cbSize 定义TRACKMOUSEEVENT结构体的大小;
dwFlags 定义跟踪请求,可以是下列值的组合:
TME_CANCEL取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型,例如要取消hover跟踪,就必须同时传送TME_CANCEL和TME_HOVER(TME_CANCEL|TME_HOVER)。
TME_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);就不会有错误了。为什么呢?

这两个函数的区别,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函数联合使用,即使在鼠标移出窗口区时也能够响应。

时间: 2024-12-20 18:14:05

TrackMouseEvent与_TrackMouseEvent的相关文章

Microsoft Win32 to Microsoft .NET Framework API Map

Microsoft Win32 to Microsoft .NET Framework API Map .NET Development (General) Technical Articles Microsoft .NET Framework and Microsoft Visual Studio User Education TeamsMicrosoft Corporation January 2004 Applies to:    Microsoft® .NET Framework ver

MFC使用TRACKMOUSEEVENT触发mouseHover和mouseLeave

为对话框添加WM_MOUSEHOVER或WM_MOUSELEAVE消息并不会响应. MFC需要特殊处理,其中一法就是使用TRACKMOUSEEVENT void CmfcDlgDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 //GetDlgItem(IDC_BUTTON)->SetWindowText("Move"); if (!m_bTracking) { TRACKMOUS

delphi OnMouseLeave 事件不灵敏及解决之道(使用TrackMouseEvent函数进行加强)

http://topic.csdn.net/t/20020104/09/456913.html CM_MouseLeave消息好象不太灵敏,当鼠标快速移出窗体时,就收不到这个消息,请问大家有什么好办法吗? #1楼 得分:0回复于:2002-01-04 09:32:23 那就用上一级组件的CM_MouseEnter配合 #2楼 得分:0回复于:2002-01-04 11:05:35移出窗体了,不行. #3楼 得分:0回复于:2002-01-04 11:14:54cm_mouseleave的确不太好

VC自绘按钮

看了吕鑫老师的视频,自己试着编写了一个自绘按钮控件.YuButton.h头文件如下: #pragma once   #include "afxwin.h"   class CYuButton :public CWnd   {       private:           BOOL  m_bIsDown;           BOOL  m_bIsMove;           BOOL  _bMouseTrack;//鼠标追踪状态              CString  m_s

WM_MOUSELEAVE和WM_MOUSEHOVER使用

默认情况下,窗口是不响应 WM_MOUSELEAVE 和 WM_MOUSEHOVER 消息的,所以要使用 _TrackMouseEvent 函数来激活这两个消息.调用这个函数后,当鼠标在指定窗口上停留超过一定时间或离开窗口后,该函数会 Post 这两个消息到指定窗口. 使用方法:1. 在对话框类中定义一个变量来标识是否追踪当前鼠标状态,之所以要这样定义是要避免鼠标已经在窗体之上时,一移动鼠标就不断重复产生 WM_MOUSEHOVER . BOOL _bMouseTrack=TRUE ; 2. 在

自定义编辑框VC,可加载更改字体,添加背景图片,显示输入提示信息

搞了一天终于弄了个完整的编辑框控件出来了, 哎,,,搞界面开发还是有点复杂的. 1 #pragma once 2 3 #include "AdvEdit.h" 4 // CBkgEditBox 5 6 class CBkgEditBox : public CEdit 7 { 8 DECLARE_DYNAMIC(CBkgEditBox) 9 10 public: 11 CBkgEditBox(); 12 virtual ~CBkgEditBox(); 13 14 protected: 1

VC常用小知识

(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现.AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化. (2) 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名.Example:TCHARexeFullPath[MAX_PATH] // MAX_PATH在API中定义了吧,好象是128G

MFC自绘控件学习总结第二贴

首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html 1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意.可以在这里改变控件的大小,位置,窗口样式,字

Windows界面编程-背景图片、透明特效使用

Windows界面编程第一篇 位图背景与位图画刷 可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors us