[Win32SDK基本]WM_MOUSELEAVE消息和TrackMouseEvent
2015-06-17 13:45
471 查看
本文由CSDN用户zuishikonghuan所作,转载请注明出处/article/9672499.html
WM_MOUSELEAVE这个消息很有意思,它是鼠标指针离开窗口时发送的,但是它每一次发送都必须用TrackMouseEvent注册一次。
如果想自绘制窗口控件(比如按钮),使用WM_MOUSELEAVE消息判断鼠标移出重画,可以很简单地实现按钮的鼠标在上面变色移出时恢复。(据说这种方法有一些问题,就是如果鼠标按住窗口再离开的话WM_MOUSELEAVE就会在鼠标放开的时候再响应,另外SetCapture貌似也能实现类似功能,但没有试过,我会在我以后会发的GdiplusFlat博文中进一步介绍)
先来看看TrackMouseEvent的函数原型:
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646265(v=vs.85).aspx
参数: lpEventTrack
A pointer to a TRACKMOUSEEVENT structure that contains tracking information
一个TRACKMOUSEEVENT结构体的指针
返回值:成功非0,失败0
再看看TRACKMOUSEEVENT:
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645604(v=vs.85).aspx
cbSize
Type: DWORD
The size of the TRACKMOUSEEVENT structure, in bytes.
结构体的大小
dwFlags 标志
这个标志有很多,这里只说两个(需要用的到)
TME_CANCEL: 调用者想要取消事先跟踪请求。调用方还应指定它想要取消的跟踪的类型。例如,若要取消离开通知,调用方必须通过 TME_CANCEL 和 TME_LEAVE 的标志。
TME_LEAVE: 调用方要离开通知。作为 WM_MOUSELEAVE消息传递通知。如果鼠标不在指定的窗口,立即生成离开通知。
hwndTrack
Type: HWND
A handle to the window to track.
窗口句柄
dwHoverTime 本文这里为0即可
特别提示:TrackMouseEvent注册一次只生效一次。就是说调用一次TrackMouseEvent,系统只发送一次WM_MOUSELEAVE消息,所以应该在没次鼠标进入窗口就调用,即在WM_MOUSEMOVE里调用。
继续使用上次的代码(/article/9672496.html),在回调函数里加入:
WM_MOUSELEAVE这个消息很有意思,它是鼠标指针离开窗口时发送的,但是它每一次发送都必须用TrackMouseEvent注册一次。
如果想自绘制窗口控件(比如按钮),使用WM_MOUSELEAVE消息判断鼠标移出重画,可以很简单地实现按钮的鼠标在上面变色移出时恢复。(据说这种方法有一些问题,就是如果鼠标按住窗口再离开的话WM_MOUSELEAVE就会在鼠标放开的时候再响应,另外SetCapture貌似也能实现类似功能,但没有试过,我会在我以后会发的GdiplusFlat博文中进一步介绍)
先来看看TrackMouseEvent的函数原型:
BOOL WINAPI TrackMouseEvent( _Inout_ LPTRACKMOUSEEVENT lpEventTrack );
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms646265(v=vs.85).aspx
参数: lpEventTrack
A pointer to a TRACKMOUSEEVENT structure that contains tracking information
一个TRACKMOUSEEVENT结构体的指针
返回值:成功非0,失败0
再看看TRACKMOUSEEVENT:
typedef struct tagTRACKMOUSEEVENT { DWORD cbSize; DWORD dwFlags; HWND hwndTrack; DWORD dwHoverTime; } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645604(v=vs.85).aspx
cbSize
Type: DWORD
The size of the TRACKMOUSEEVENT structure, in bytes.
结构体的大小
dwFlags 标志
这个标志有很多,这里只说两个(需要用的到)
TME_CANCEL: 调用者想要取消事先跟踪请求。调用方还应指定它想要取消的跟踪的类型。例如,若要取消离开通知,调用方必须通过 TME_CANCEL 和 TME_LEAVE 的标志。
TME_LEAVE: 调用方要离开通知。作为 WM_MOUSELEAVE消息传递通知。如果鼠标不在指定的窗口,立即生成离开通知。
hwndTrack
Type: HWND
A handle to the window to track.
窗口句柄
dwHoverTime 本文这里为0即可
特别提示:TrackMouseEvent注册一次只生效一次。就是说调用一次TrackMouseEvent,系统只发送一次WM_MOUSELEAVE消息,所以应该在没次鼠标进入窗口就调用,即在WM_MOUSEMOVE里调用。
继续使用上次的代码(/article/9672496.html),在回调函数里加入:
<pre class="cpp" name="code">case WM_MOUSEMOVE://鼠标移动 TRACKMOUSEEVENT a; a.cbSize = sizeof(TRACKMOUSEEVENT); a.dwFlags = TME_LEAVE; a.hwndTrack = hwnd; TrackMouseEvent(&a); break;
case WM_MOUSELEAVE: MessageBox(hwnd, TEXT("鼠标离开了窗口"), TEXT(""), 0); break;
相关文章推荐
- 智能交通领域权威期刊会议
- 微信公众号上传多媒体文件接口用JAVA怎么实现
- 解决iOS8.0以上系统下无法通过代码创建被删除过的同名相册 ( iOS 8 Photos framework: Create a albums with iOS8 )
- 在python安装基础上两步命令安装Gensim
- libcurl教程
- fcn
- “由于下列错误,Parallel port driver 服务启动失败”,注意了
- OC2-重写
- Linux系统编程——特殊进程之孤儿进程
- .ClassCastException: .LinearLayout cannot be cast to android.widget.TextView
- Grunt教程——Gurnt任务的配置
- LibCurl编程手册以及代码实例
- 收藏:FLASH中键检测与右键屏蔽
- Linux系统编程——特殊进程之僵尸进程
- HEVC,VP9,x264性能对比
- code::Blocks生成的dll 在 java jni 调用遇到的问题
- iOS开发UI之Quartz2D使用(绘制基本图形)
- 圆形切换按钮
- Android Studio jni编译生成so文件
- iOS中获取当前时间和日期并设置格式