Почему WheelDelta = 120?

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

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

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


person Kromster    schedule 13.10.2011    source источник
comment
Число 120 было выбрано потому, что оно имеет больше множителей, чем 100.   -  person Raymond Chen    schedule 13.10.2011


Ответы (4)


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

См. эту статью из MSDN< /а>

person codencandy    schedule 13.10.2011
comment
Из документации MSDN по WM_MOUSEWHEEL (msdn.microsoft.com/en-us/library/windows/desktop/): дельта была установлена ​​​​на 120, чтобы Microsoft или другие поставщики могли создавать колеса с более высоким разрешением (свободно вращающееся колесо без выемок). для отправки большего количества сообщений за оборот, но с меньшим значением в каждом сообщении. Чтобы использовать эту функцию, вы можете либо добавлять входящие значения дельты до тех пор, пока не будет достигнуто значение WHEEL_DELTA (поэтому для дельта-вращения вы получите тот же ответ), либо прокручивать частичные строки в ответ на более частые сообщения. - person robocat; 18.10.2012
comment
Обновлена ​​ссылка MSDN для WM_MOUSEWHEEL: msdn.microsoft.com/en-us/library/windows/desktop/ - person Josh Kelley; 19.07.2013
comment
WHEEL_DELTA расширяется до 120, как всегда. Его определение не изменилось. Его значение также не изменилось. Это значение дельты, которое соответствует одной метке (на колесе с насечками). Дельта меньше, чем WHEEL_DELTA, означает поворот менее чем на полную отметку. - person Buster; 31.03.2017

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

QPoint QWheelEvent::angleDelta() константа

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

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

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

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

person math    schedule 14.05.2013
comment
+1, но все же это не отвечает, почему выбрано 1/8, а не, например. 1/10 или 1/2. - person Kromster; 14.05.2013
comment
Я мог предположить, что вам нужно 3 бита для представления 8 значений. 0..7. Это может объяснить, почему 1/10 не используется. И я думаю, что 1/2 не используется, так как он недостаточно детализирован. Однако я только предполагаю, и я действительно не знаю. - person math; 21.10.2013

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

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

My.Computer.Mouse.WheelScrollLines

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

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

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

person J Collins    schedule 13.10.2011
comment
В Delphi.Windows.pas WHEEL_DELTA = 120; Я думаю, если вы установите WheelScrollLines на 4, он станет 4, но не будет связи с WheelDelta, который останется 120. Отсюда мой первоначальный вопрос :) - person Kromster; 14.10.2011
comment
Да, я добавил туда эту поправку, всегда 120. Думаю, моя главная мысль на самом деле о делимости, поскольку, как и в случае с углами в градусах, 120 делится без остатка на кучу разных чисел. - person J Collins; 14.10.2011
comment
В WinUser.h есть #define WHEEL_DELTA 120. - person Dominik Seibold; 12.06.2012
comment
@J Collins Вот почему в футе 12 дюймов. - person Andy k; 22.07.2016

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

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

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

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

Редактировать:

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

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

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

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

person robocat    schedule 05.10.2012
comment
Я не вижу здесь ответа, только некоторые предположения и слабо связанные факты. - person Kromster; 05.10.2012