Почему WheelDelta = 120? - PullRequest
       6

Почему WheelDelta = 120?

11 голосов
/ 13 октября 2011

Я работаю с событиями мыши, в частности OnMouseWheel.Во многих примерах кода расстояние изменения вида (или масштабирование в 3D-приложении) определяется как Distance = Sign(WheelDelta)*Constant или Distance = WheelDelta / WHEEL_DELTA или что-то в этом роде - при условии, что WheelDelta всегда кратно 120 (постоянная WHEEL_DELTA = 120).

Я уже обнаружил, что в сенсорных интерфейсах / планшетах ввод может зависеть от длины прокрутки.

Мне было интересно, почему Microsoft установила для WheelDelta по умолчанию значение 120, а не 100 или 10 или что-то еще?В каких других случаях колесо дельта может отличаться от 120?

Ответы [ 4 ]

8 голосов
/ 14 мая 2013

Документация Qt более подробно описывает, почему это на самом деле 120:

QPoint QWheelEvent :: angleDelta () const

Возвращает расстояние, на которое вращается колесо, в восьмых градусах. положительное значение указывает, что колесо было повернуто вперед от пользователь; отрицательное значение указывает, что колесо было повернуто назад в направлении пользователь.

Большинство типов мыши работают с шагом 15 градусов, в этом случае значение дельты равно кратный 120; то есть 120 единиц * 1/8 = 15 градусов.

Тем не менее, некоторые мыши имеют колеса с более высоким разрешением и посылают значения дельты, которые менее 120 единиц (менее 15 градусов). Чтобы поддержать эту возможность, вы можно либо кумулятивно добавить значения дельты из событий до значения 120 достигается, затем прокрутите виджет, или вы можете частично прокрутить виджет в ответ на каждое событие колеса.

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

7 голосов
/ 13 октября 2011

WHEEL_DELTA больше не фиксируется на 120. Насколько я понимаю, эта константа была выбрана для обеспечения более точных разрешений в будущем, что, очевидно, СЕЙЧАС.

См. Эту статью от MSDN

3 голосов
/ 13 октября 2011

Вопрос помечен как уже отвеченный. Я подумал, что мог бы предоставить больше информации.

Если я правильно понимаю, WHEEL_DELTA на самом деле 40, а не 120, 120 получается из драйвера мыши, умножая необработанное значение WHEEL_DELTA наколичество строк для прокрутки, которое по умолчанию 3. Вы можете получить номер строки прокрутки, используя

My.Computer.Mouse.WheelScrollLines

. Это легче всего увидеть с помощью элемента управления NumericUpDown, который при прокрутке корректирует значение с шагомумноженное на количество строк.

Просто возиться с моей мышью-колесиком, на полный оборот приходится 18 стопоров, что составляет 20 градусов на стопор (Конечно, я знаю, что в мире это небольшой выборка мышей ...!).40 предполагает, что они чувствовали, что половина градусов была достаточно хорошей, хотя этот последний абзац является предположением.

РЕДАКТИРОВАТЬ: Не один, чтобы распространять дезинформацию, при дальнейшем изучении WHEEL_DELTA на самом деле 120, NumericUpDown оказалсяложно положительный.Тем не менее, остальная часть обсуждения верна, если к логике можно применить коэффициент три.

0 голосов
/ 05 октября 2012

Как вы заметили, сенсорные панели ноутбука могут прокручиваться (либо двумя пальцами, либо зоной прокрутки по размеру правой руки), и в этом случае может быть много событий с очень маленькими значениями wheelDelta (либо требуется интеграция, либо, возможно, таймауты, чтобы предотвратить слишком много). много перерисовок).

Кроме того, различные ОС или конфигурации или устройства могут иметь разное значение для прокрутки - пиксели, строки или страницы. например DOM event.deltaMode

Наконец, некоторые устройства (мыши и сенсорные панели) также допускают горизонтальную прокрутку.

Вышеуказанное относится более конкретно к событиям DOM браузера, но те же проблемы могут относиться и к событиям Win.

Edit:

Из документов Firefox MDN вас могут заинтересовать три события: WM_MOUSEWHEEL, WM_MOUSEHWHEEL и WM_GESTURE (панорамирование на сенсорных устройствах).

A поиск в базе данных Mozilla Bugzilla показывает множество проблем с некоторыми драйверами Symantics и ALPS touch, отправляющими WM_VSCROLL вместо WM_MOUSEWHEEL (может быть актуально при поддержке сенсорных панелей).

Если вам нужна поддержка горизонтальной прокрутки мыши, эта статья от разработчика флэш-памяти говорит: [поддержка колесика мыши] была добавлена ​​в Vista, поэтому, если вы используете XP или 2000, вам нужен IntelliType Pro и / или IntelliPoint. для поддержки WM_MOUSEHWHEEL.

@ Krom: больше спекуляций и вымышленных фактов, но, возможно, полезных для других

...