2011-10-13 32 views
10

我正在使用鼠标事件,特别是OnMouseWheel。许多代码示例指的是视图更改的距离(或3D应用中的f.i.),如Distance = Sign(WheelDelta)*ConstantDistance = WheelDelta/WHEEL_DELTA或其他类似的 - 假定WheelDelta总是120的倍数(WHEEL_DELTA常量= 120)。为什么WheelDelta = 120?

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

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

+27

120被选择,因为其具有更多的因素大于100 –

回答

5

WHEEL_DELTA不再固定为120.据我所知,这个常数被选择为允许在未来有更好的分辨率,这显然是NOW。

请参阅本文从MSDN

+0

从上WM_MOUSEWHEEL MSDN文档(http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617 (v = vs.85).aspx): “Delta设置为120,允许Microsoft或其他供应商构建更精细的轮子(自由旋转的轮子,无切口),以便每轮发送更多消息,但每条消息的值越小,要使用此功能,您可以添加输入增量值,直到达到WHEEL_DELTA(因此对于增量旋转,您会得到相同的响应),或者滚动部分线以响应更频繁的消息ES“。 – robocat

+0

已更新WM_MOUSEWHEEL的MSDN链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617%28v=vs.85%29.aspx –

+2

+1 ...“未来,这显然是现在“! – Sabuncu

3

的回答已经我想我可能会提供一些更多的信息的问题被标记。

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

My.Computer.Mouse.WheelScrollLines 

这可以非常容易地用一个NumericUpDown控件,其上滚动调整由增量乘以该行计数的值看出。

只是搞乱了我的滑轮鼠标,在完整的革命中有18个棘爪,每个棘爪20度(当然,我知道这是世界上小鼠样本的大小......)。 40表明他们觉得半程度还不错,尽管这最后一段是假设。

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

+0

在Delphi.Windows.pas WHEEL_DELTA = 120;我猜如果你将WheelScrollLines设置为4,它将变成4,但没有连接到WheelDelta,它将保持120.因此,我原来的问题:) – Kromster

+0

是的,我在那里抛出那个修正,它总是120.我想我的主要思想实际上是关于可分性的,因为像度角一样,120可以被一堆不同的数字整除。 –

+0

在WinUser.h中有#define WHEEL_DELTA 120. –

0

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

另外不同的操作系统或配置或设备可以有不同的滚动含义 - 像素,线条或页面。例如DOM event.deltaMode

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

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

编辑:

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

A search of the Mozilla Bugzilla database显示了一些Symantics和ALPS touch驱动程序发送WM_VSCROLL而不是WM_MOUSEWHEEL(如果支持触摸板可能相关)的各种问题。

如果您想要支持水平鼠标滚动,this article来自flash dev说:[鼠标滚轮支持]已添加到Vista中,所以如果您使用的是XP或2000,则需要为WM_MOUSEHWHEEL支持安装IntelliType Pro和/或IntelliPoint。

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

+1

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

7

Qt文档阐述多一点,为什么它实际上是120:

int QGraphicsSceneWheelEvent::delta() const 

返回的距离轮子以1/8秒(1/8秒)旋转,角度为 度。正值表示车轮向远离用户的方向旋转 ;负值表示轮子朝向用户向后旋转 。 大多数鼠标类型以15度为单位工作,在这种情况下,增量值是120的倍数(== 15 * 8)。

http://doc.qt.digia.com/4.7/qgraphicsscenewheelevent.html#delta

+1

+1,但仍不能解释为什么它被选为1/8而不是例如1/10或1/2。 – Kromster

+0

我可以猜到,你需要3位来表示8个值。 '0..7'。这也许可以解释为什么不使用1/10。我猜'1/2'没有用,因为它不够细。但是,我只是猜测,我真的不知道。 – math