Иллюстрированный самоучитель по SVGA

Формирование кодов событий

В примере 6.10 четвертая команда вызывает подпрограмму statins, текст которой приведен в примере 6.12. Она формирует и передает задаче данные о событиях, связанных с манипулятором "мышь". Выполняемые в ней действия оформлены в виде подпрограммы, для того чтобы их можно было использовать не только в управляющем алгоритме, но и в других случаях, когда нужны данные о состоянии мыши.

Прежде чем описывать подпрограмму statms, обсудим те соображения, которыми руководствовался автор при ее разработке.

Функции драйвера

Драйвер поддерживает три функции, которые позволяют получить разные данные о состоянии мыши.

Функция Mouse 3 возвращает в регистрах , сх и dx текущие значения счетчиков координат на экране и состояние кнопок. В сх находится номер столбца (координата х), а в dx – номер строки (координата Y). Три младших разряда регистра bх отражают состояние кнопок. Левой кнопке соответствует нулевой разряд, правой – первый и средней – второй. Если кнопка нажата, то соответствующий ей разряд установлен, а если не нажата, то очищен. Некоторые драйверы позволяют в процессе установки переопределить правую и левую кнопки, это предусмотрено специально для людей, которым удобнее работать левой рукой. В таком случае нулевой разряд регистра bх отражает состояние правой кнопки, а первый разряд – левой.

Функция Mouse 5 возвращает данные о количестве нажатий на одну из кнопок и значение координат в момент последнего нажатия. Перед ее вызовом в регистре bх указывается номер кнопки: bх=0 для левой, bx=1 для правой и bх=2 для средней. В том же регистре (bх) драйвер возвращает количество нажатий на указанную кнопку, произошедших после последнего опроса ее состояния. Кроме того, в регистре ах возвращается состояние всех кнопок в том же виде, в каком эти данные возвращала функция Mouse 3 в регистре bх. При этом в регистрах сх и dx находятся значения координат в момент последнего нажатия на указанную кнопку.

Функция Mouse 6 отличается от Mouse 5 только тем, что возвращает информацию не о нажатии, а об отпускании указанной кнопки.

Функция Mouse 3 применяется наиболее часто. Функции Mouse 5 и Mouse 6 нужны в специальных случаях и, вообще говоря, при программировании работы с мышью без них можно обойтись.

Взаимосвязь событий

В технической документации любые изменения в состоянии мыши принято называть событиями (event). Функция Mouse 3 возвращает данные об элементарных событиях, в общем случае этого не достаточно для выполнения задачей конкретных действий.

Предположим, что в результате опроса драйвера установлен факт нажатия левой кнопки. Сам по себе этот факт мало что говорит, важно знать, изменилось ее состояние или нет. Если кнопка уже была нажата, то ее состояние не изменилось. Аналогичные рассуждения применимы и в случае, если кнопка не нажата. Следовательно, для оценки изменения состояния кнопки надо учитывать результаты предыдущего и текущего опросов драйвера.

Кроме того, кнопка могла быть нажата при неподвижной мыши или при ее перемещении. На практике движение мыши при нажатой левой кнопке обычно используется для перемещения рисунка на экране. А нажатие на левую кнопку при отсутствии перемещения мыши может применяться, например, для выбора элемента меню. Следовательно, при анализе произошедшего события надо учитывать не только текущее и предшествующее состояние кнопок, но и фактор движения мыши.

Каждый из перечисленных факторов может принимать одно из двух взаимоисключающих значений – кнопка нажата или не нажата, мышь движется или неподвижна. Всего возможны восемь событий, перечисленных в табл. 6.2.

В табл. 6.2 перечислены элементарные события. Из них могут складываться более сложные события, например, во многих случаях применяется быстрое двухкратное нажатие (double-click) на кнопку. Его можно описать как повторное нажатие на одну и ту же кнопку в течение короткого отрезка времени при отсутствии перемещения мыши. Для распознания такого события задача должна спустя заданное время повторно опросить драйвер и убедиться в том, что в обоих случаях был получен код 2.

Таблица 6.2. Перечень событий для одной кнопки мыши.

Код события Движение мыши Старое состояние Новое состояние
0 Неподвижна Не нажата Не нажата
1 Неподвижна Не нажата Нажата
2 Неподвижна Нажата Не нажата
3 Неподвижна Нажата Нажата
4 Движется Не нажата Не нажата
5 Движется Не нажата Нажата
6 Движется Нажата Не нажата
7 Движется Нажата Нажата
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.