WM_MOUSEWHEEL消息
使用WM_MOUSEWHEEL
需要把CWnd设定为Focus
ON_WM_MOUSEWHEEL( )
CWnd::OnMouseWheel
afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );
返回值:如果允许鼠标轮滚动,则返回非零值;否则返回0。
参数:
nFlags 指明是否按下了虚拟键。这个参数可以是下列值的组合:
· MK_CONTROL 如果CTRL键被按下,则设置此位。
· MK_LBUTTON 如果鼠标左键被按下,则设置此位。
· MK_MBUTTON 如果鼠标中键被按下,则设置此位。
· MK_RBUTTON 如果鼠标右键被按下,则设置此位。
· MK_SHIFT 如果SHIFT键被按下,则设置此位。
zDelta 指明了旋转的距离。zDelta值以WHEEL_DELTA,即120的倍数或部分的形式表达。小于零的数表明往回滚动(向着用户),而大于零的数表明滚向远处(离开用户)。用户可以在鼠标软件中改变滚轮设置以反转这种响应。有关这个参数的更多信息参见说明部分。
pt 指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。
说明:
当用户旋转鼠标滚轮并达到滚轮的下一个刻度时,框架就调用这个成员函数。除非被重载,否则OnMouseWheel调用WM_MOUSEWHEEL的缺省处理。Windows自动将该消息转发到具有输入焦点的控件或子窗口。Win32函数DefWindowProc将该消息上传到拥有它的窗口。
zDelta参数是WHEEL_DELTA的倍数,它被设为120。这个值是要采取的动作的开端,这一类动作(比如向前滚动到下一个刻度)必须为每一个delta产生。
delta被设为120,以允许将来使用更高精度的滚轮,例如没有刻度的自由旋转滚轮。这种设备在每次旋转是可能会发送多个消息,但是每次消息中的值更小。要支持这个可能性,或者可以累计输入的delta值,直到达到一个WHEEL_DELTA(因此你达到与给定delta的旋转相同的响应),或者滚动部分行以响应更频繁的消息。你可以选择你的滚动精度并累计delta值直到达到WHEEL_DELTA。
重载这个成员函数以提供你自己的鼠标滚轮滚动特性。
注意 OnMouseWheel为Windows NT 4.0处理消息。对于Windows 95或Windows NT 3.51 的消息处理,应使用OnRegisteredMouseWheel。
实现应用程序支持鼠标滚轮的关键是,捕获鼠标滚轮的消息 MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是为95准备的,需要Intellimouse驱动程序,而WM_MOUSEWHEEL是目前各版本Windows(98/NT40/2000)内置的消息。本文主要处理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的语法。
WM_MOUSEWHEEL
fwKeys = LOWORD(wParam); /* key flags */
zDelta = (short) HIWORD(wParam);
/* wheel rotation */
xPos = (short) LOWORD(lParam);
/* horizontal position of pointer */
yPos = (short) HIWORD(lParam);
/* vertical position of pointer */
其中:fwKeys指出是否有CTRL、SHIFT、鼠标键(左、中、右、附加)按下,允许复合。zDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),大于零表示滚轮向前滚动(朝显示器方向)。lParam指出鼠标指针相对屏幕左上的x、y轴坐标。
滚轮按钮相当于普通的三键鼠标的中键,根据滚轮按钮的动作,Windows分别发出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,这些消息VB已经在鼠标事件中支持。
需要进一步说明的是,对用户界面鼠标滚轮的操作也要遵循公共用户界面操作习惯,不要随意定义一些怪异的操作,如果你编制的应用程序支持鼠标滚轮,请看看是否符合下面这些标准。
垂直滚动:当用户向后滚动轮子(朝用户方向),滚动条向下移动;向前滚动轮子(朝显示器方向),滚动条向上移动。对文档当前的选择应该不受影响,对数据库当前记录指针不变。
水平滚动:如果同时有垂直滚动条,鼠标滚轮首先应控制上下滚动;当文档只有水平滚动杠时,用户向后滚动轮子,滚动条向右移动,向前滚动轮子,滚动条向左移动。对文档当前的选择应该不受影响,对数据库字段选择不受影响。
滚动速度:鼠标滚轮每滚一个刻痕,对于长文档移动的行数,应符合控制面板中鼠标的定义(默认移动三行),对短文档每次滚一行,在任何情况下,决不要超过窗口显示的行数。
平移:平移事实上就是滚动条的连续操作。平移一般是配合滚轮按钮的拖拽,最好提供方向指示光标。
自动滚动:自动滚动通常开始于鼠标滚轮按钮单击,以后任何击键、鼠标按键或者滚动鼠标滚轮终止。滚动方向和速度取决于鼠标偏移滚轮按钮单击时原始位置的方向和距离,距原始位置标记越远自动滚动越快,距离近则慢。应用程序需要提供初始位置位图以及方向指示图标。
缩放:在按住 Ctrl 键的同时前后滚动滚轮。向后滚动轮子(朝用户方向),缩小比例;向前滚动轮子(朝显示器方向),增大比例。
今天调试程序时,发现该消息附带的坐标不是窗口坐标,而是屏幕座标。后来Google了下,发现不仅如此,此消息和它兄弟消息不一样,消息直接发送到具有Focus的控件,而不是鼠标底下的控件。
这个值向前为正,向后为负。每次都是正负120或其倍数,当增量超过120时,才会判断鼠标滚轮有效移动。
鼠标滚轮的移动系数K=Delta/120
WM_MOUSEWHEEL消息的更多相关文章
- TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)
注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...
- WM消息对应的Message消息中的Lparam和WParam
具体的消息表示: 1. WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 2. 滚动条WM_VSCROLL或WM_HSCROLL消息,LOWOR ...
- 【转】各种消息下wParam及lParam值的含义
转载自:http://bbs.fishc.com/forum.php?mod=viewthread&tid=52668#lastpost 01.WM_PAINT消息 LOWORD(lParam ...
- MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息
windows的消息具有以下两个参数: (1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体.附加信息的消息号取 ...
- wparam , lparam 传递消息
01.WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 02.滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam) ...
- WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱
mfc中,碰到以下问题:父对话框A.子窗口B.B是CWnd对象.需要在B中处理WM_MOUSEWHEEL.WM_LBUTTONDOWN等消息. 所以在B中增加对应的消息处理,发现B中的消息循环中,收不 ...
- 用DirectX实现魔方(三)视角变换及缩放(附源码)
在本系列第一篇介绍过鼠标按键的功能,如下. 左键拖拽 - 旋转魔方 右键拖拽 - 变换视角 滚轮 - 缩放魔方 今天研究一下如何实现后面两个功能,用到的技术主要是Arcball,Arcball是实现M ...
- wParam与lParam的区别
wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(H ...
- WIN32编程经验总结
一 窗口和消息 1. 前缀: 2 WPARAM和LPARAM的意义在Windows是一种16位系统时,WndProc的第三个参数被定义为WORD,是一个16位的无符号整数,而第四个参数被定义为一个LO ...
随机推荐
- 无法删除尚未附加的实体-linq中使用反射删除记录出现错误,应该如何解决。
db.airports.Attach(data); db.airports.DeleteOnSubmit(data); db.SubmitChanges();
- zooKeeper_《ZooKeeper官方指南》一致性保障
转 http://ifeve.com/zookeeper-consistency-guarantees/ 本文翻译自<ZooKeeper官方指南>,译者:追云,校对:追云 一致性保障 Zo ...
- 213. String Compression【easy】
Implement a method to perform basic string compression using the counts of repeated characters. For ...
- Ubuntu 的 apt-get 代理设置(zhuan)
url: http://qixinglu.com/post/ubuntu_apt-get_proxy_setup.html 升级到 Ubuntu10.04 后,发现 apt-get 的代理设置有改变了 ...
- JQuery EasyUI datagrid pageNumber 分页 请求/加载 两次
解决方案: 原因是 jquery.easyui.min.js 源文件中,由于第1页的total和其他页的total不相等,EasyUI会重新发起第1页的请求!1.jQuery EasyUI 1.4.1 ...
- linux命令之高级使用 service
service命令,顾名思义,就是用于管理Linux操作系统中服务的命令. 1. 声明:这个命令不是在所有的linux发行版本中都有.主要是在redhat.fedora.mandriva和centos ...
- STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)
推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前 ...
- httpClient使用中报错org.apache.commons.httpclient.HttpMethodBase - Going to buffer response body of large or unknown size.
在使用HttpClient发送请求,使用httpMethod.getResponseBodyAsString();时当返回值过大时会报错: org.apache.commons.httpclient. ...
- ios-A+B经典问题
// // main.m // a+b // #import <Foundation/Foundation.h> #import "Calcultor.h" int m ...
- ES查看配置和查看全部配置
http://10.0.0.17:9200/blog/_settings GET 获取单个index(库的配置) http://10.0.0.17:9200/_settings/_all GE ...