События мыши: имена, порядок и область обработчика
Имена событий мыши, порядок их доставки, состояние указателя в момент события и область видимости обработчика; концептуальный пример трёх состояний для отслеживания нажатия без гарантий конкретного фреймворка.

Назначение
Событие мыши возникает, когда указатель перемещается, нажимается или отпускается в пределах окна или элемента интерфейса. Понимание того, как события называются, что фиксируется в момент каждого события и как обработчик отслеживает взаимодействие, позволяет проектировать поведение программы без обращения к конкретному синтаксису языка. Ниже рассматриваются эти вопросы на примере простого нажатия на кнопку.
Имена событий
Системы событий мыши используют короткие имена, отражающие действие указателя: перемещение, вход в область элемента, выход из неё, нажатие кнопки и отпускание. Каждое имя кодирует одно действие, и программа может назначить отдельный обработчик для каждого из них. Имена не являются универсальными: написание, регистр и набор событий различаются от реализации к реализации, поэтому конкретные идентификаторы следует сверять с документацией используемого фреймворка. Важно также различать физическое действие и событие: кнопка мыши нажимается или отпускается, а вход и выход указателя из области элемента описываются отдельными событиями, не связанными с нажатием.
Последовательность событий
Нажатие на кнопку порождает несколько событий, но порядок их доставки зависит от фреймворка, фокуса окна, механизма захвата, отмены и маршрутизации. Типичный сценарий включает вход указателя, нажатие, перемещение с зажатой кнопкой и отпускание, однако обработчик не может полагаться на то, что все эти события дойдут до него в этом порядке. Отмена взаимодействия, потеря фокуса или изменение захвата могут привести к тому, что обработчик получит отпускание без предшествующего нажатия или выход из области без ранее полученного входа. Поэтому состояние компонента требует явной очистки при любых неожиданных событиях.
Состояние указателя
В момент каждого события система фиксирует текущее состояние указателя: координаты, нажатые кнопки, активные модификаторы. Обработчик получает это состояние как часть описания события. Координаты относятся к системе отсчёта, определённой конкретной API: относительно окна, элемента или экрана. Не все события несут полный снимок состояния; наличие полей для координат, кнопок и модификаторов определяется документацией фреймворка, а не самим фактом события.
Область обработчика
Обработчик может получать события, направленные на другие элементы, если фреймворк поддерживает маршрутизацию через всплытие или захват. Это означает, что обработчик, назначенный на кнопку, способен видеть события, возникшие в дочерних элементах или даже вне геометрической области кнопки, если маршрут доставки это предусматривает. Область действия обработчика определяется не только геометрией элемента, но и механизмом маршрутизации выбранной системы.
Пример: концептуальная машина состояний
Представим вымышленный компонент с четырьмя состояниями: Ожидание, Нажатие, Перетаскивание и Отмена. В Ожидании компонент получает нажатие и переходит в Нажатие. Перемещение с зажатой кнопкой переводит его в Перетаскивание. Отпускание возвращает в Ожидание. Если в состоянии Нажатие или Перетаскивание приходит событие отмены или отпускание без предшествующего нажатия, компонент переходит в Отмена и сбрасывает накопленное состояние. Этот переход в Отмена отражает реальную необходимость: обработчик не может гарантировать, что каждое отпускание сопровождается наблюдаемым нажатием, и должен уметь восстанавливаться из любого промежуточного положения.