关于TrackMouseEvent用法总结

对于这个函数我也是最近想研究控件自绘才知道它真正怎么用.以前只是见到过.,废话不多说.

我先说下我的问题:如何响应鼠标离开某个窗体(控件)事件?

先大概讲下步骤,然后再集中对TrackMouseEvent进行详解:

为按钮添加以下几个函数:

● OnMuseMove:这个函数时MFC内部已经做好了的事件:主要响应鼠标移动事件.但是这个事件有一个严重的问题:它只能识别鼠标是否在其上移动.

● OnMouseLeave():这个是自定义函数(但是要在消息映射里面与WM_MOUSELEAVE对应

OnMouseMove需要加上的代码段如下:

if ( m_bOver == FALSE )

{

m_bOver = TRUE;

TRACKMOUSEEVENT tme;

tme.cbSize = sizeof( TRACKMOUSEEVENT );

tme.dwFlags = TME_LEAVE;

tme.hwndTrack = m_hWnd;

tme.dwHoverTime = 0;

::TrackMouseEvent( &tme );

}

此时当鼠标移入的时候,m_bOverTRUE.

我们在到OnMouseLeave函数里面把m_bOver设回FLASE.

此时我们可以通过m_bOver来获取鼠标的状态(是否在所属控件内.).现在运行程序会报错对不对.加上一下代码就可以了:

extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack); 

typedef struct tagTRACKMOUSEEVENT {

DWORD cbSize; //TRACKMOUSEEVENT结构的大小

DWORD dwFlags;//定义服务请求

    HWND hwndTrack; //待跟踪窗口的句柄

    DWORD dwHoverTime;//定义hover事件耗尽时间

} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

结构详解:

● dwFlags:取值如下:TME_CANCEL取消前一次的跟踪请求;使用该项时必须指定要取消跟踪的类型.(如果想要取消hover跟踪,则应传入TME_CANCEL和TME_HOVER.可以发送WM_MOUSEHOVER消息,如果在hover跟踪处于激活状态时再次请求hover跟踪的话,hover的定时器将被重置.

TME_LEAVE鼠标离开.发送TME_MOUSELEAVE消息.当鼠标不在指定的窗口或者区域上时,将立即产生一个leave通知,不在做任何跟踪

TME_QUERY这一项不是作为跟踪请求的.选中这一项时,当结构体被传送给TrackMouseEvent函数时,即产生当前跟踪.唯一不同的是返回的消耗时间,是真实的消耗时间,而不是HOVER_DEFAULT,即使之前TrackMouseEvent函数锁请求的是HOVER_DEFAULT.

● dwHoverTime:单位为毫秒.可以使用HOVER_DEFAULT来使用系统默认的hover事件耗尽时间.

默认是菜单下拉时间,即400毫秒.可以调用SystemParameterInfo函数并使用SPI_GETMOUSEHOVERTIME来获取系统默认的hover耗尽时间.默认的hover矩形区与双击区一致.也可以使用SPI_GETMOUSEHOVERWIDTH(HEIGHT)来获取鼠标在上面停留可以产生的区域.

另外要注意的是:

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

TrackMouseEvent函数的几点说明:

此函数能寄送如下消息:

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

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

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

ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)  ON_MESSAGE(WM_MOUSEHOVER,OnMouseHover) 才能使用   

注意:WM_MOUSELEAVE响应函数为 

void OnMouseLeave(WPARAM wp,LPARAM lp),有些地方说,若写成 void OnMouseLeave(),Release下运行会出现错误.

备注:当鼠标指针在指定时间内停留在指定矩形内,就被认为是处于盘旋状态。调用函数   SystemParameterslnfo并使用SPI_GETMOUSEAOVERWIDTHSPI_GETMOUSEHOVERAEIGHT和   SFI_GETMOOSEAOVERTIME值来取得矩形的大小和时间。 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
目录 (1) 如何通过代码获得应用程序主窗口的 指针? 5 (2) 确定应用程序的路径 6 (3) 如何在程序中获得其他程序的 图标? 6 (4) 获得各种目录信息 7 (5) 如何自定义消息 8 (6) 如何改变窗口的图标? 8 (7) 如何改变窗口的缺省风格? 8 (8) 如何将窗口居中显示? 9 (9) 如何让窗口和 MDI窗口一启动就最大化和最小化? 10 (10) 如何限制窗口的大小? 10 (11) 如何使窗口不可见? 10 (12) 如何创建一个字回绕的CEditView 10 (13) 如何使程序保持极小状态? 11 (14) 移动窗口 11 (15) 通用控件的显示窗口 12 (16) 重置窗口的大小 12 (17) 如何单击除了窗口标题栏以外的区域使窗口移动 12 (18) 如何改变视窗的背景颜色 14 (19) 如何改变窗口标题 15 (20) 如何防止主框窗口在其说明中显示活动的文档名 17 (21) 如何获取有关窗口正在处理的当前消息的信息 17 (22) 如何在代码中获取工具条和状态条的指针 18 (23) 如何使能和禁止工具条的工具提示 18 (24) 如何创建一个不规则形状的窗口 19 (25) 如何获取应用程序的 实例句柄? 23 (26) 如何编程结束应用程序? 23 (27) 如何创建和使用无模式对话框 24 (28) 如何防止主框窗口在其说明中显示活动的文档名 26 (29) 如何在代码中获取工具条和状态条的指针 27 (30) 怎样加载其他的应用程序? 27 (31) 如何在代码中获取工具条和状态条的指针 28 (33) 如何设置工具条标题 29 (34) 如何使窗口始终在最前方? 30 (35) 如何在对话框中显示一个位图 30 (36) 如何改变对话或窗体视窗的背景颜色 30 (37) 如何获取一个对话控件的指针 32 (38) 如何禁止和使能控件 33 (39) 如何改变控件的字体 33 (40) 如何在OLE控件中使用OLE_COLOR数据类型 35 (41) 在不使用通用文件打开对话的情况下如何显示一个文件列表 35 (42) 为什么旋转按钮控件看起来倒转 36 (43) 为什么旋转按钮控件不能自动地更新它下面的编辑控件 37 (44) 如何用位图显示下压按钮 37 (45) 如何一个创建三态下压按钮 38 (46) 如何动态创建控件 38 (47) 如何限制编辑框中的准许字符 38 (48) 如何改变控件的颜色 40 (49) 当向列表框中添加多个项时如何防止闪烁 43 (50) 如何向编辑控件中添加文本 43 (51) 如何访问预定义的GDI对象 44 (52) 如何获取GDI对象的属性信息 45 (53) 如何实现一个橡皮区矩形 46 (54) 如何更新翻转背景颜色的文本 49 (55) 如何创建一个具有特定点大小的字体 50 (56) 如何计算一个串的大小 51 (57) 如何显示旋转文本 52 (58) 如何正确显示包含标签字符的串 54 (59) 如何快速地格式化一个CString对象 55 (60) 串太长时如何在其末尾显示一个省略号 55 (61) 为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 56 (62) 如何给系统菜单添加一个菜单项 56 (63) 如何确定顶层菜单所占据的菜单行数 58 (64) 在用户环境中如何确定系统显示元素的颜色 59 (65) 如何查询和设置系统参数 59 (66) 如何确定当前屏幕分辨率 60 (67) 如何使用一个预定义的Windows光标 60 (68) 如何检索原先的Task Manager应用程序使用的任务列表 61 (70) 在哪儿创建临文件 63 (71) 我怎样才能建立一个等待光标? 64 (73) 如何访问桌面窗口 65 (74) 什么是COLORREF? 我该怎样用它? 66 (75) AppWizard所产生的STDAFX文件是干什么用的? 66 (76) 我在我的程序中是了CDWordArray。我向它添加了约10,000个整数,这使得它变得非常非常慢。为什么会这么糟? 67 (77) 我该如何改变MDI框架窗口的子窗口的大小以使在窗口以一定的大小打开? 67 (78) 在我的程序的某些部分,我可以调用 MessageBox 函数来建立一个信息对话框,例如在视类中。 67 (79) 我需要在我的程序中设置全局变量,以使文档中的所有类都能访问。我应该吧它放到哪儿? 68 (80) 我听说MFC可以发现内存漏洞,我怎样使用该特性? 68 (81) 我怎样才能在我的应用程序中循环浏览已经打开的文档? 68 (82)才能在我的应用程序中循环浏览已经打开的视? 68 (83)数PreCreateWindow是干什么用的? 69 (84)该怎样防止MFC在窗口标题栏上把文档名预置成应用程序名? 69 (85) 我应该怎样防止MFC在窗口标题栏上添加文档名? 69 (86)我应该如何改变视窗口的大小? 69 (87)我有一无模式对话框。我怎样才能在窗口退出时删除CDialog对象? 69 (88)为什么把“delete this”放在PostNcDestroy中而不是OnNcDestroy? 69 (89) File菜单中的MRU列表是从哪儿来的?列表中的名字放在哪儿了?我怎样才能改变列表中项目的最大值? 70 (90) 我在菜单中添加了新的项。但是,当我选该项时,在状态栏上没有出现任何提示信息。为什么? 70 (91) 我怎样才能在应用程序的缺省系统菜单中加上一些东西? 70 (92) 我建立了一个对话框。但是当我显示该对话框时,第一个编辑框总是不能获得焦点,我必须单击它来使它获得焦点。我怎样才能使第一个编辑框在对话框打开时就获得焦点? 71 (93) 我怎样才能使一个窗口具有“always on top”特性? 71 (94) 我要为我的form view添加文档模板。我先建立了对话框模板,然后使用ClassWizard建立了基于CFormView的新类,它也是从CDocument继承来的。我还建立了相应的资源并在InitInstance中添加了新的文档模板。但是,当我试图运行该程序时,出现了Assertion信息。为什么? 71 (95) 我在一对话框中有一列表框,我需要tabbed列表框中的项目。但是,当我处理含有tab字符(用AddString添加的)的列表项时,tab被显示成小黑块而没有展开。哪儿出错了? 72 (96) 我建立了一个应用程序,并使用了CRecordset类。但是,当我运行该程序时,它试图要访问数据库,并给出“Internal Application Error”对话框。我应该怎样做? 72 (97) 我用ClassWizard建立了一个类。但是,我把名字取错了,我想把它从项目中删除,应该如何做? 73 (98) 当我打开应用程序中的窗口时,我要传递该窗口的矩形尺寸。该矩形指定了窗口的外围大小,但是当我调用GetClientRect时,所得到的尺寸要比所希望的值要小(因为工具栏和窗口边框的缘故)。有其它方法来计算窗口的尺寸吗? 73 (99) 我在文档类中设置了一个整型变量。但是,当我试图把该变量写入Serialize函数中的archive文件中时,出现了类型错误。而文档中的其它变量没有问题。为什么? 73 (100) 如何控制菜单的大小? 74 (101) 改变LVIS_SELECTED的状态颜色? 75 (102) 如何只存储文档的某一部分? 76 (103) 保存工具条菜单有bug吗? 76 (104) Tip of the day的bug 76 (105) 如何可以让我的程序可以显示在其它的窗口上面? 77 (106) 如何控制窗口框架的最大最小尺寸? 79 (107) 如何改变窗口框架的颜色? 81 (108) 如何将应用程序窗口置于屏幕正中? 82 (1)当文档被修改时,如何在标题上加上标志'*'? 82 (2)VC6.0对VC5.0的兼容性? 83 (3)打印和打印机的问题? 83 (4)CRichEditCtrl滚动条的问题? 84 (5)从数据库中读大于32k的内容? 84 (6)如何获得CRichEditCtrl中字符的位置? 86 (7)如何限制mdi子框架最大化时的大小? 86 (8)如何切换视口而不破坏它们? 87 (9)改变列表控制时发生闪烁现象? 91 (10)处理列表控件可见项的问题? 91 (11)产生线程的问题? 91 (12)CFile使用了缓冲区吗? 94 (13)DAO的密码? 94 (15)视口的不活动性如何处理? 96 (16)如何使用COleClientItem的IDispatch接口? 97 (17)关于用户自定义的消息使用? 98 (18)在打开一个文档时退出? 99 (19)在CListCtrl控件中多选择项的删除? 99 (20)工作线程的登录状态? 99 (21)如何增加视图中ActiveX控件的事件处理函数? 101 (22)如何创建一个动态的Tree控件? 102 (23)SDI程序开始时不打开文档? 102 (24)List控件中整栏选择? 103 (25)如何重载MRU文件? 104 (26)CImageList控件中图象橙色被显示为黄色? 106 (27)无法正确改变应用程序的图标? 110 (28)工具条状态的问题? 110 (29)在SDI应用程序中使用Active控件? 112 (30)有RichEdit控件的对话框无法正常显示? 112 (31)DLL中的模板成员函数? 112 (32)CFormView中的上下文帮助? 114 (33)CArchive类的WriteObject函数问题? 115 (34)RegisterWindowMessage中的BroadcastSystemMessage如何处理? 115 (35)CListCtrl中选择变化时如何获得通知? 117 (36)如何向ATL-COM对象传送一个数组? 118 (37)如何选择CTreeCtrl中的节点文本进行编辑? 119 (38)如何改变默认的光标形状? 120 (39)如何用键盘滚动分割的视口? 121 (40)如何在线程中处理状态条? 123 (41)如何阻止WINDOWS关闭? 124 (42)如何使一个按钮Disable? 124 (43)怎样从MFC扩展动态链结库(DLL)中显示一个对话框? 125 (44)想隐藏用户界面怎么办? 127 (45)如何实现SDI与MDI的转换? 128 (46) CDC中的竖排文本? 130 (47)如何激活变灰的弹出菜单? 131 (48)线程消息? 132 (49)TreeCtrl控制的显示速度太慢? 133 (50)关于工具条? 135 (51)关于线程消息? 136 (52)关于控件的焦点? 136 (53)如何捕获键盘按键? 138 (54)怎样实现3D效果? 138 (55)怎样建立客户CSocket? 138 (56)Disable一个非模态对话框的客户区? 140 (57)关于使用SetClassLong和SetCapture问题 140 (58)动画控件? 142 (59)错误声明的消息? 143 (59)怎样模拟鼠标动作? 144 (60)改变对话框标题字体? 145 (61)怎样知道CWinThread对象的状态? 146 (62)如何调整控件对话框条的大小? 146 (63)如何顶端显示CStatic类文字? 147 (64)消息句柄出了什么事? 147 (65)树形控件为何闪烁? 148 (66)怎样才能关闭树形控件中的滚动条? 149 (67)如何建立一个带滚动条的窗口? 149 (68)如何实现对话框的拖放? 150 (69)TrackMouseEvent()怎么了 151 (70)奇怪的组合框控件 152 (71)关于使用MS SANS SERIF字体 152 (72)为什么DLL在字符串表中找不到字符串 157 (73)关于复选框的文本颜色 158 (74)系列化与版本的问题 159 (75)在一个控件内检测并使用ON_COMMAND消息 162 (76)为何MDI程序中有子窗口打开时主应用程序不能关. 163 (77)滚动视中LPtoDP失败 165 (78)ODBC许可问题 166 (79)怪异的字体 167 (80)自画列表框样例 170 (81)CWnd::GetMenu()的问题 173 (82)用MFC制作弹出窗口 174 (83)怎样取消一个弹出式菜单 175
2014/11/11 19:53 93,104 ASCII表.htm 2014/10/11 16:12 13,340 C++模板类-classTest.rar 2014/11/10 21:55 179,424 CDib-位图操作类.rar 2007/12/06 13:16 2,678 CInifile.rar 2007/12/06 13:20 2,442 CIniFile.zip 2014/10/23 16:15 47,038 CLISTCTRL派生类,可排序设置背景色,可直接编辑修改.rar 2013/03/29 16:20 16,688 ColorEdit_ColorStatic.zip 2014/10/25 13:54 59,452 CustomCTreeCtrl 自绘.zip 2014/10/11 16:12 28,392 CWnd自绘编辑框.zip 2010/04/23 17:07 39,721 dll导出类.rar 2008/05/28 11:31 1,254 DoubleEdit.rar 2010/08/09 11:17 5,448 FileDialogEx(Windows2000风格的对话框).rar 2008/05/19 13:45 1,080 IntEdit.rar 2010/01/07 12:51 14,463 list2list.rar 2008/01/22 16:41 23,911 lkf_exe2swf.rar 2014/11/11 19:51 80,951 manage_src.rar 2014/10/23 16:15 34,508 MFC改变 CListCtrl、CHeaderCtrl 高度、字体、颜色和背景.rar 2008/01/21 12:39 29,999 mydll.rar 2005/01/29 18:56 53,722 pconline_vc_txt.zip 2014/11/11 19:57 0 readme.txt 2007/12/18 16:54 12,058 SDK_hello.rar 2011/12/19 23:41 1,103,084 SimLibrary(简洁图书馆).rar 2014/11/11 19:53 txt 2014/10/23 08:13 103,191 VC使用dll文件-MyDll.rar 2014/10/11 20:49 843,174 vc+png按钮渐变(能运行)加备注.rar 2004/02/26 01:39 38,822 Visual C++编程技巧html.zip 2014/10/14 16:47 2,645 Windows VC++ 调整进程当前目录为程序可执行文件所在目录.rar 2012/02/12 17:16 71,575 任意数学表达式计算_src.rar 2014/10/14 16:47 3,523 使用VC库函数中的快速排序函数-QSort.rar 2009/07/03 13:22 16,163 创建椭圆窗体.rar 2009/07/05 08:49 16,252 半透明别的窗口.rar 2010/08/06 15:38 3,248 启动闪屏.rar 2007/10/01 13:41 22,160 图像与文字的合成.rar 2014/10/23 08:13 18,052 基于CWnd自绘控件使用TrackMouseEvent函数-TestCtrl.rar 2004/04/11 13:57 131,912 处理位图的例子.rar 2006/08/19 11:40 300,440 学生请假系统ado.rar 2014/11/08 23:11

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值