Главная страничкаИсходники программСтатьи и описанияПроекты и разработкаПолезные ссылкиЗадай вопрос, получи ответВыскажи свое мнениеПишите письма

Работа с мышей

Точнее, здесь речь пойдет о прерывании $33, которое предоставляет нам возможность работать с мышью. Вызывается прерывание с номером функции в регистре AX, которую мы хотим задействовать и входными параметрами в регистрах процессора, если нужно, после чего получаем результат в тех же регистрах. На Pascal'е это делается так.

Uses DOS;
….
Procedure ResetMouse;
Var Rp:Register;
Begin

Rp.Ax:=0;
Intr($33,Rp);

End;
….
или так

Procedure ResetMouse;Assembler;
Asm

mov ax,0
int $33

End;

Во втором примере модуль DOS не нужен, но это менее надежно, если вы не умеете работать на Assembler'е , хотя быстрее первого.

А теперь к функциям

Функция $0: Сбросить мышь.
Сброс мыши желательно производить при начале работы с ней, так как, например, при переключении видео режимов мышь может глючить если ее не сбросить.

На входе:
AX = $0

На выходе:
AX = $0000 - мышь не найдена или драйвер не установлен
$FFFF - мышь найдена
BX - Количество кнопок
0 - не 2 кнопки
2 - 2 кнопки
3 - 3 кнопки

Функция $1: Показать указатель мыши на экране

Работает в текстовом режиме и стандартных видео режимах, не дружит с VESA, хотя иногда и дружит, главная проблема с режимами где более 256 цветов.

На входе:
AX = $1;

На выходе ничего

Функция $2: Убрать указатель мыши

То-же что и функция 1 но убирает указатель с экрана

На входе:
AX = $2;

На выходе ничего

Функция $3: Получить состояние мыши

Данная функция позволяет узнать положение указателя мыши и состояние нажатия кнопок.

На входе:
AX = $3;

На выходе:
BX - Байт состояния кнопок
Бит 0 - Левая кнопка
Бит 1 - Правая кнопка
Бит 2 - Средняя кнопка
CX - Горизонтальная координата мыши (X)
DX - Вертикальная координата мыши (Y)
В текстовом режиме значения CX и DX нужно делить на 8 или Rp.CX:=Rp.CX shr 3;

Функция $4: Задать координаты указателя

Позволяет установить координаты указателя мыши

На входе:
AX = $4;
CX,DX - X,Y соответственно

На выходе ничего

Для текстового режима координаты умножаются на 8;

Функция $5 и $6: Получить информацию о кол-ве нажатия или отпускания кнопок

Позволяет узнать количество нажатий на ту или иную кнопку, нужно для отслеживания двойного нажатия.

На входе:
AX = $5; - Количество нажатий и AX = $6; - Кол-во отпускания кнопки
BX - Индификатор кнопки (номер кнопки как в функции 3)

На выходе:
BX - Количество нажатий или отпускания кнопки
CX,DX - Координаты последнего нажатия

Функция $7 и $8: Установить область перемещения указателя по горизонтали и вертикали соответственно

На входе:
AX = $7; - По горизонтали и AX = $8 по вертикали
CX - минимальная координата
DX - максимальная координата

На выходе ничего:

При помощи этих функции можно избавится от некоторых глюков в графических режимах, особенно нестандартных. Точнее сказать, для точного перемещения указателя по экрану, желательно сразу указать как область перемещения указателя весь экран (0, 0) - (MaxX,MaxY)

Функция $9: Задать форму указателя для графического режима

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

На входе:
AX = $9;
BX - Смещение от левого края изображения
CX - Смещение от правого края изображения
ES:DI - указатель на 64 байтовый массив, хранящий в себе форму указателя, где
первый 32 байта - маска, а вторые 32 байта сам указатель, те биты в маске которые равны 1 не рисуются.

На выходе ничего

Функция $A: Задать форму указателя для текстового режима

На сегодняшний день мало используется, так как вообще по моему ни кому не надо

На входе:
AX = $A;
BX=Aлаг указателя
0-програмное управление формой
1-аппаратное управление формой
CX- маска экрана для BX =0 или верхняя строка развертки для BX=1
DX- маска указателя для ВХ=0 или нижняя строка развертки для BX=1

На выходе ничего

Функция $B: Получить счетчик шагов перемещения

На входе:
AX=$B

На выходе:
DX,CX-количество шагов по вертикали(горизонтали) после последнего вызова $0B

Функция $C: Задать условия вызова программы пользователя

На входе:
AX=$C
CX=условия вызова:
0-мыш перемещается
1-нажимается левая кнопка
2-отпускается левая кнопка
3-нажимается правая кнопка
4-отпускается правая кнопка
5-нажимается средняя кнопка
6-отпускается левая кнопка
ES:DX=адрес программы пользователя вывод (вызывается процедура по адресу es:dx)

На выходе или в процедуре (точно не знаю):
AX-маска условия (состояние CX при вводе)
BX-состояние кнопок
CX,DX-координаты
DI,SI-число шагов мыши по горизонтали и вертикали
DS-сегмент данных драйвера мыши

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

Функция $D: Включить эмуляцию светового пера

На входе:
AX=$0D ВКЛЮЧИТЬ

На выходе ничего

Функция $F:Установить отношение числа шагов на единицу виртуального экрана (скорость перемещения мыши)

На входе
AX=$0F
CX,DX - количество сотых долей дюйма по горизонтали и вертикали на 8 пикселов. По умолчанию CX и DX равны 8, чем больше коэффициент тем меньше мышь по экрану катится

На выходе ничего

Функция $13: Установить порог удвоения скорости смещения указателя мыши

На входе
AX=$13
DX=новое значение

На выходе ничего

Функция $14: Заменить процедуру пользователя

Если вас достала процедура пользователя установленная функцией $C то ее можно заменить.
На входе:
AX=$14
CX=условия вызова:
0-мыш перемещается
1-нажимается левая кнопка
2-отпускается левая кнопка
3-нажимается правая кнопка
4-отпускается правая кнопка
5-нажимается средняя кнопка
6-отпускается левая кнопка
ES:DX=адрес программы пользователя вывод (вызывается процедура по адресу es:dx)

На выходе:
CX - условия вызова ранее установленной процедуры
ES:DX - адрес старой процедуры

Функция $15: Получить размер буфера необходимого для сохранения состояния драйвера.

На входе:
AX=$15
BX=0

На выходе:
BX - размер буфера в байтах

Функция $16: Сохранить текущее состояние драйвера

На входе:
AX=$16
ES:DX - адрес буфера

На выходе ничего

Функция $17: Восстановить состояние драйвера

На входе:
AX=$17
ES:DX - адрес буфера с сохраненным состоянием

На выходе ничего

Функция $1D: Задать видеостраницу для указателя

На входе
AX=$1D
BX=Номер видео страницы

На выходе ничего

Функция $1Е: Получить видеостраницу

На входе:
AX=$1E

На выходе
BX=Номер видео страницы

Ну вот и все, успехов.


Rambler's Top100