Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВССиТ / МУ-Программирование устройств-ПЗ.docx
Скачиваний:
42
Добавлен:
28.03.2015
Размер:
243.95 Кб
Скачать

4.7 Управление «мышью»

Манипулятор «мышь» относится к интерактивным устройствам, обеспечивающим связь человека с вычислительной машиной /6/.

Согласно /4/, единицей перемещения мыши является «микки» - сигналы, которые подсчитывает мышь, а потом через определённые интервалы передаёт драйверу. Последний использует эти сигналы для определения положения мыши, преобразуя их в пиксели на экране. Драйвер автоматически перемещает курсор на экране в соответствии с движением мыши и отслеживает координаты курсора, а также предоставляет пользовательской программе ряд функций по использованию мыши. Эти функции обрабатываются прерыванием мыши INT 33h.

1) Начальная установка драйвера мыши.

Функция 0h (пересылается в AH) прерывания 33h производит начальную установку и возвращает информацию о текущем состоянии аппаратных и программных средств мыши. Функция определяет текущий режим экрана, прячет курсор и помещает его в центр экрана, а также задаёт начальные значения внутренним переменным драйвера (подробнее в /3/). В качестве результата в регистре AX возвращается значение FFFFh (мышь и драйвер мыши установлены), в регистре BX – количество кнопок мыши: 0002h – две кнопки, 0003h – три кнопки, 0000h – другое количество кнопок. В противном случае, в регистре AX возвращается значение 0000h – мышь или драйвер мыши не установлены.

2) Показ/ сокрытие курсора мыши.

Драйвер мыши поддерживает внутренний счетчик, управляющий видимостью курсора мыши. Функция 2h уменьшает значение счетчика на единицу, а функция 1h увеличивает его, но только до значения 0. Если значение счетчика - отрицательное число, он спрятан, если ноль - показан.

2.1) Чтобы показать курсор необходимо в регистр AH переслать функцию 1h и вызвать прерывание 33h.

2.2) Чтобы спрятать курсор необходимо в регистр AH переслать функцию 2h и вызвать прерывание 33h.

Нужно иметь в виду, что на каждый вызов функции 2h впоследствии должен быть произведен вызов функции 1h, для того чтобы восстановить внутреннее значение флажка курсора. Кроме того, при каждом переключении режима экрана функция 2h вызывается автоматически.

3) Определение состояния мыши.

Для определения положения курсора мыши и состояния её кнопок используется функция 3h (пересылается в AH) прерывания 33h. В качестве результата эта функция возвращает в регистре BX состояние кнопок мыши, в регистре CX – координату по оси X, в регистре DX – координату по оси Y. В регистре BX первые 3 бита (0-2) отвечают за состояние кнопок (Таблица 4.9), остальные биты не используются.

Таблица 4.9 – Биты состояния кнопок мыши

бита

Описание

0

Левая кнопка мыши

1

Правая кнопка мыши

2

Средняя кнопка мыши

Если бит установлен (равен 1), то соответствующая кнопка нажата, если сброшен (равен 0) – кнопка отпущена.

Возвращаемые координаты совпадают с пиксельными координатами соответствующей точки на экране в большинстве графических режимов, кроме 4, 5, 0Dh, 13h, в которых Х-координату мыши нужно разделить на 2, чтобы получить номер столбца соответствующей точки на экране. В текстовых режимах обе координаты надо разделить на 8, чтобы получить номер строки и столбца соответственно.

4) Установка/ отмена обработчика событий мыши.

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

Такую возможность обеспечивает функция 0Ch  (пересылается в AH) - установить обработчик событий. Битовая маска определяет условия, вызывающие прерывания. Установленный в 1 бит разрешает прерывание, сброшенный в 0 – запрещает прерывание. При вызове данной функции битовая маска помещается в регистр CX; описание битов маски представлено в таблице 4.10.

Таблица 4.10 – Описание битов маски

бита

Описание

0

Изменение позиции курсора мыши

1

Нажатие левой кнопки мыши

2

Отпускание левой кнопки мыши

3

Нажатие правой кнопки мыши

4

Отпускание правой кнопки мыши

5

Нажата средняя кнопка мыши

6

Отпускание средней кнопки мыши

7-15

Не используются

Драйвер фирмы Microsoft следит за позицией мыши, а драйверы фирм Logitech и Mouse Systems – за позицией курсора.

Также при вызове функции пара регистров ES:DX должна содержать адрес дальнего перехода на процедуру обработки прерываний.

Обработчик событий должен быть оформлен, как дальняя процедура. На входе в процедуру обработчика необходимо передать следующие параметры:

1) регистр АХ содержит условие вызова (биты установлены также как и в маске вызова);

2) регистр ВХ содержит состояние кнопок;

3) регистры СХ, DX — X- и Y-координаты курсора мыши, соответственно;

4) регистры SI, DI — счетчики последнего перемещения по горизонтали и вертикали (единицы измерения для этих счетчиков — микки, 1/200 дюйма).

После завершения работы подпрограммы работа прикладной программы возобновляется в той точке, где была прервана.

Перед завершением программы установленный обработчик событий должен быть обязательно удален (вызов функции 0Ch с СХ=0), так как иначе при первом же выполнении условия управление будет передано по адресу в памяти, с которого начинался обработчик.