_TrackMouseEvent 与 WIN32 ToolTip.docx

上传人:A*** 文档编号:141377348 上传时间:2020-08-07 格式:DOCX 页数:9 大小:135.01KB
返回 下载 相关 举报
_TrackMouseEvent 与 WIN32 ToolTip.docx_第1页
第1页 / 共9页
_TrackMouseEvent 与 WIN32 ToolTip.docx_第2页
第2页 / 共9页
_TrackMouseEvent 与 WIN32 ToolTip.docx_第3页
第3页 / 共9页
_TrackMouseEvent 与 WIN32 ToolTip.docx_第4页
第4页 / 共9页
_TrackMouseEvent 与 WIN32 ToolTip.docx_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《_TrackMouseEvent 与 WIN32 ToolTip.docx》由会员分享,可在线阅读,更多相关《_TrackMouseEvent 与 WIN32 ToolTip.docx(9页珍藏版)》请在金锄头文库上搜索。

1、_TrackMouseEvent 与 WIN32 ToolTip前言:我之所以将这两个部分放在一起写,当然是因为他们是有关系的啦,我们的窗口是不会响应WM_MOUSELEAVE和WM_MOUSEHOVER消息的,我们可以通过_TrackMouseEvent来激活这两个消息,让我们的窗口接收这两个消息,接收到消息后,我们能干嘛呢?注意WM_MOUSEHOVER消息,当我们在一个控件上停一段时间后,就会激发这个消息,这个消息应该叫“悬停”,所以,在鼠标悬停时,我们应该创建toolTip!这就是两者的关系。我们先看_TrackMouseEvent是如何激活这两个消息的,然后再看怎样添加ToolTip

2、。先看个最终界面图,吸引下大家一、_TrackMouseEvent默认情况下,窗口是不响应WM_MOUSELEAVE和WM_MOUSEHOVER消息的,所以要使用_TrackMouseEvent函数来激活这两个消息。调用这个函数后,当鼠标在指定窗口上停留超过一定时间或离开窗口后,该函数会Post这两个消息到指定窗口。1、添加头文件和库在stdafx.h中,添加所需要的头文件和库文件,代码如下:#include #pragma comment(lib, comctl32.lib)2、使用方法(1)在对话框类中定义一个变量来标识是否追踪当前鼠标状态,之所以要这样定义是要避免鼠标已经在窗体之上时,一

3、移动鼠标就不断重复产生WM_MOUSEHOVER。并初始化为false,意思是尚未开始追踪!bool m_bMouseTracking;/追踪WM_MOUSELEAVE 和 WM_MOUSEHOVER 消息(2)在WM_MOUSEMOVE中开启追踪 case WM_MOUSEMOVE: / Start tracking this entire window again. if( !m_bMouseTracking ) /如果没有跟踪消息,则开启跟踪WM_MOUSEHOVER和WM_MOUSELEAVE消息 TRACKMOUSEEVENT tme = 0 ; tme.cbSize = sizeo

4、f(TRACKMOUSEEVENT); tme.dwFlags = TME_HOVER | TME_LEAVE; tme.hwndTrack = m_hWnd;/ 指定要追踪的窗口 tme.dwHoverTime = 10;/鼠标在按钮上停留超过10ms,才认为状态为HOVER _TrackMouseEvent(&tme);/开启Windows的WM_MOUSELEAVE,WM_MOUSEHOVER事件支持 m_bMouseTracking = true;/为true表示已经开启追踪,false表示现在未跟踪 (3)WM_MOUSEHOVE、WM_MOUSELEAVE中的处理 case WM_

5、MOUSEHOVER: m_bMouseTracking=false; return true; case WM_MOUSELEAVE: if( m_bMouseTracking ) :SendMessage(m_hWnd, WM_MOUSEMOVE, 0, (LPARAM) -1); m_bMouseTracking = false; break;二、WIN32 ToolTip创建上面我们完成了对WM_MOUSEHOVER和WM_MOUSELEAVE的追踪,但我们没有做任何的实际工作,我们使用_TrackMouseEvent只是开启了对这两个消息的接收,在接收到消息后,并没有做什么,下面我们

6、就在接收到WM_MOUSEHOVER悬停消息后,创建ToolTip(提示文字)(1)创建两个变量 HWND m_hwndTooltip;/TOOLTIP的句柄 TOOLINFO m_ToolTip;讲解:m_hwndTooltip:保存创建的tooltip窗体的句柄;m_ToolTip:保存tooltip窗体的创建信息;(2)创建显示在需要创建显示TOOLTIP的地方,按照下面的代码,创建就会直接显示出来; / Create tooltip information CStdString sToolTip = LHAHA HERE XXXXXXXXXXXXnXXXXXXXXXXXXXXXXXXX

7、XXXXXnXXXXXXXXXXXXXXXXXXnXXXXXXXXXXXXXXXXXXXXXXX; if( sToolTip.IsEmpty() ) return true; :ZeroMemory(&m_ToolTip, sizeof(TOOLINFO); /m_ToolTip.cbSize = sizeof(TOOLINFO); m_ToolTip.cbSize=TTTOOLINFOA_V2_SIZE; m_ToolTip.uFlags = TTF_IDISHWND | TTF_SUBCLASS; m_ToolTip.hwnd = m_hWnd; m_ToolTip.uId = (UINT

8、_PTR) m_hWnd; m_ToolTip.hinst = m_hInstance; m_ToolTip.lpszText = const_cast( (LPCTSTR) sToolTip ); m_ToolTip.rect =pHover-GetPos();/不用指定显示位置,系统会自动判断位置 if( m_hwndTooltip = NULL ) m_hwndTooltip = :CreateWindowEx(0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | TTS_BALLOON, CW_USEDEF

9、AULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, m_hWnd, NULL, m_hInstance, NULL); :SendMessage(m_hwndTooltip, TTM_ADDTOOL, 0, (LPARAM) &m_ToolTip); :SendMessage(m_hwndTooltip, TTM_SETMAXTIPWIDTH, 0, 20); /要多行显示,要先加上这个,然后在要分段的地方加上n :SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, TRUE, (LPARAM) &m_T

10、oolTip);讲解:1、创建步骤:首先填充TOOLINFO结构体;在填充时,m_ToolTip.rect是不必填充的,系统会自动根据当前的鼠标位置显示TOOLTIP; 然后SendMessage-TTM_ADDTOOL,增加TOOLTIP到系统中,也就是让系统创建TOOLTIP窗体; 最后SendMessage-TTM_TRACKACTIVE,激活当前的TOOLTIP,也就是让其显示出来2、m_ToolTip.cbSize的填充必须注意!-直接影响到会不会显示出来,这部分会引用另一篇文章在下面讲解(参见:四、参考 -2);有些同鞋,根据上面的创建步骤死活就是显示不出来,为什么呢!m_Tool

11、Tip.cbSize赋值时出错了!如果#define _WIN32_WINNT 0x0500,赋值方式必须是:m_ToolTip.cbSize = sizeof(TOOLINFO)而如果_WIN32_WINNT = 0x0501,对应的赋值方式必须是:m_ToolTip.cbSize=TTTOOLINFOA_V2_SIZE;3、多行显示多行显示必须有两个步骤才能完成:(1)在显示的字符串中,将要分段的地方用“n”分隔;(2)添加代码::SendMessage(m_hwndTooltip, TTM_SETMAXTIPWIDTH, 0, 20); /要多行显示,要先加上这个,然后在要分段的地方加上

12、n(3)撤销显示在需要撤销显示的位置,添加上下面这行代码,取消TOOLTIP的激活状态if( m_hwndTooltip != NULL ) :SendMessage(m_hwndTooltip, TTM_TRACKACTIVATE, FALSE, (LPARAM) &m_ToolTip);三、源码讲解(最后有源码下载)我们在WIN32界面开发之四:CPaintManagerUI类构建的基础上进行修改,利用这些教程逐步逼近DUILIB,争取把DUILIB一步步实现,如果对上篇还不了解的同学,还是先看看DUIRudiment是怎么构架的吧。突然到一节来估计是看不懂的。按照上面的内容,大家也应该知

13、道,我们这里要添加的功能就是添加_TrackMouseEvent和TOOLTIP(1)、修改CPaintManagerUI1、为CPaintManagerUI添加m_hInstance变量;大家从TOOLTIP的创建也可以知道,创建ToolTip是要当前应用程序的hInstance的,所以我们要先保存起来,与DUILIB一致,添加静态变量:static HINSTANCE m_hInstance;/注意在类外初始化和一个设置函数:static void SetInstance(HINSTANCE hInst);设置函数的实现:void CPaintManagerUI:SetInstance(HINSTANCE hInst) m_hInstance = hInst;2、初始化m_hInstance在WinMain()函数的开头,调用CPaintManagerUI:SetInstance()int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) Gdiplus:GdiplusStartupInput gdiplusStartupInput; Gdiplus:G

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号