问题 为什么WheelDelta = 120?


我正在处理鼠标事件 OnMouseWheel。许多代码示例指的是视图更改的距离(或在3D应用程序中缩放f.i.) Distance = Sign(WheelDelta)*Constant 要么 Distance = WheelDelta / WHEEL_DELTA 或者类似的东西 - 假设WheelDelta总是120的倍数(WHEEL_DELTA常数= 120)。

我已经发现在触摸界面/平板电脑输入可能取决于滚动长度。

我想知道为什么微软将默认的WheelDelta设置为120,为什么不是100或10或其他什么?在其他情况下,轮三角可能与120不同?


5595
2017-10-13 11:02


起源

选择120是因为它有超过100的因子。 - Raymond Chen


答案:


WHEEL_DELTA不再固定为120.据我所知,这个常数被选中以允许将来更精细的分辨率,这显然是现在。

请参阅此文章 MSDN


5
2017-10-13 11:18



来自WM_MOUSEWHEEL上的MSDN文档(msdn.microsoft.com/en-us/library/windows/desktop/...):“delta被设置为120,以允许Microsoft或其他供应商构建更精细分辨率的轮子(没有凹槽的自由旋转的轮子)每次旋转发送更多的消息,但每个消息中的值更小。使用此功能,你可以添加传入的增量值,直到达到WHEEL_DELTA(因此对于增量旋转你得到相同的响应),或者滚动部分线以响应更频繁的消息。“ - robocat
更新了WM_MOUSEWHEEL的MSDN链接: msdn.microsoft.com/en-us/library/windows/desktop/... - Josh Kelley
+1为“......将来,显然是现在”!!! - Sabuncu
WHEEL_DELTA一如既往地扩展到120。它的定义没有改变。它的意义也没有改变。它是delta值,对应于一个凹口(在具有凹口的车轮上)。小于WHEEL_DELTA的delta意味着转弯不到一个完整档位。 - Buster


Qt文档详细阐述了为什么它实际上是120:

QPoint QWheelEvent :: angleDelta()const

返回轮子旋转的距离,以度数的八分之一为单位。一个   正值表示车轮向前旋转远离车轮   用户;负值表示车轮向后旋转   用户。

大多数鼠标类型以15度为单位工作,在这种情况下,delta值为   120的倍数;即,120个单位* 1/8 = 15度。

但是,有些鼠标具有更精细分辨率的轮子并发送delta值   少于120个单位(小于15度)。为了支持这种可能性,你   可以累积地从事件添加delta值,直到值120   到达,然后滚动窗口小部件,或者您可以部分滚动窗口小部件   响应每个车轮事件。

https://doc.qt.io/qt-5/qwheelevent.html#angleDelta


8
2018-05-14 11:16



+1,但仍然没有回答为什么它被选为1/8而不是例如1/10或1/2。 - Kromster
我猜,你需要3位表示8个值。 0..7。这可以解释为什么不使用1/10。我想 1/2 不使用,因为它不够精细。但是,我只是猜测,我真的不知道。 - math


这个问题已标记为已回答我以为我可能会提供更多信息。

如果我理解正确,WHEEL_DELTA实际上是40而不是120,120来自鼠标驱动程序将原始WHEEL_DELTA值乘以要滚动的行数,这默认为3.您可以使用以下方式获取滚动行号

My.Computer.Mouse.WheelScrollLines

使用NumericUpDown控件可以很容易地看到这一点,该控件在滚动时通过增量乘以该行数来调整值。

只是弄乱了我的滚轮鼠标,完整的旋转中有18个棘爪,每个棘爪20度(当然我知道这是世界上一个小样本的鼠标......!)。 40表明他们认为半度足够好,尽管最后一段是假设。

编辑: 没有人传播错误信息,进一步研究WHEEL_DELTA实际上是120,NumericUpDown被证明是误报。尽管如此,如果可以将三分之一应用于逻辑,则剩下的讨论是有效的。


3
2017-10-13 19:15



在Delphi.Windows.pas WHEEL_DELTA = 120;我想如果你将WheelScrollLines设置为4它将变为4,但没有连接到WheelDelta,它将保持为120.因此我原来的问题:) - Kromster
是的,我把那个校正扔在那里,它总是120.我猜我的主要思想实际上是关于可分性,因为与度角一样,120可以被一堆不同的数字整除。 - J Collins
在WinUser.h中有#define WHEEL_DELTA 120。 - Dominik Seibold
@J柯林斯这也是为什么一英尺有12英寸的原因。 - Andy k


正如您所注意到的,笔记本电脑Touchpad可以滚动(右手大小的双指或滚动区域),在这种情况下,可能会有很多具有非常小的wheelDelta值的事件(要么需要集成,要么可能超时以防止重绘太多) 。

此外,不同的OS或配置或设备可以具有不同的滚动含义 - 像素,线条或页面。例如 DOM event.deltaMode

最后,一些设备(鼠标和触摸板)也允许水平滚动。

以上内容更具体到浏览器DOM事件,但同样的问题也可能适用于Win事件。

编辑:

来自 Firefox MDN文档 您可能感兴趣的有三个事件:WM_MOUSEWHEEL,WM_MOUSEHWHEEL和WM_GESTURE(在触摸设备上平移)。

一个 搜索Mozilla Bugzilla数据库 显示一些Symantics和ALPS触摸驱动程序发送WM_VSCROLL而不是WM_MOUSEWHEEL的各种问题(如果支持触摸板可能相关)。

如果你想要水平鼠标滚动支持, 本文 来自Flash开发人员说:[鼠标滚轮支持]已添加到Vista中,因此如果您使用的是XP或2000,则需要安装IntelliType Pro和/或IntelliPoint以支持WM_MOUSEHWHEEL。

@Krom:更多的猜测和松散的事实,但也许对其他人有用:-)


0
2017-10-05 03:23



我在这里没有看到答案,只是一些猜测和松散相关的事实。 - Kromster