![]() |
![]() |
Altair |
![]() ![]()
Сообщение
#1
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Все операции, связанные с мышью, в программах выполняются посредством функций
прерывания int $33. Общий формат их вызова таков: ASM В отличии от остальных прерываний, функции которых определяются значением в регистре AH, прерывание INT $33 используют весь регистр AX. Первой используемой в программе функцией этого прерывания должна быть функция $00 (инициализация мыши). Обычно эта команда используется только один раз - в самом начале программы. Для того, чтобы программы могли использовать мышь, предварительно необходимо загрузить драйвер. Этот драйвер обычно запускается командой в файле CONFIG.SYS или AUTOEXEC.BAT (В среде Windows драйвер мыши загружается согласно записи в реестре). Ниже приведены основные термины, касающиеся мыши:
Инициализация мыши Для инициализации мыши необходимо вызвать функцию $00. Эта функция должна вызываться первой из всех команд обработчика. Для ее вызова необходимо поместить в регистр AX значение $00 и вызвать прерывание INT $33. Function InitMouse:boolean; Приведенная функция пробует инициализировать мышь, и если мышь инициализирована, возвращает true. При инициализации, в регистр BX помещается количество кнопок у обнаруженной мыши. Поскольку не всегда требуется эта информация, можно вынести определение количества кнопок у мыши в отдельную функцию: function ButtonMouse:byte; Функция возвращает количество кнопок у мыши. Эту функцию можно использовать в любом месте программы. (Это и есть тот случай, когда функцию $00 прерывания $33 вызывают второй раз). При инициализации мыши, указатель не появляется на экране. Отображение указателя мыши Для отображения указателя мыши на экране, необходимо использовать функцию $01. Драйвер мыши содержит флаг указателя, определяющий, должен ли указатель отображаться на экране. Указатель отображается, если флаг установлен в 0, и скрывается, если флаг установлен в любое другое значение. Изначально его значение -1. Функция $01 увеличивает его до 0, и курсор становится видим. Procedure ShowMouse; assembler; Зарезервированное слово Assembler, которое было использовано в приведенной процедуре, указывает компилятору, что процедура целиком написана на ассемблере. Cокрытие указателя мыши Часто в процессе работы программы, требуется на время скрыть указатель мыши, например, при выводе графики. Для этого используют функцию $02. Следующая процедура, при вызове, скрывает указатель мыши: Procedure HideMouse; assembler; Перечисленные процедуры и функции можно так использовать в программе:
Получение состояния мыши Функция $03 позволяет получить данные о текущем состоянии мыши. После вызова этой функции, в регистр BX помещается информация о состоянии кнопок, в регистр CX координата по горизонтали (х), а в регистр DX координата по вертикали (у)*(см. примечание!). Следующая процедура возвращает координаты указателя. Procedure GetMouseXY(VAR KoordX,KoordY:Word ); При написании программ, очень часто нужно проверять не находится ли указатель в заданной прямоугольной части экрана. (например на кнопке). Следующая процедура, возвращает true, если указатель находится в зоне x1,y1,x2,y2, где x1-левая граница зоны, x2 - правая граница, y1 - верхняя граница, y2 - нижняя граница. Function MouseIn(X1,Y1,X2,Y2:word):boolean; Функция $03, как уже было сказано, возвращает состояние кнопок мыши. Function ButtonPressed:byte; Функция возвращает следующие значения:
* все координаты исчисляются в пикселях!!! Даже в текстовом режиме!!! Поэтому для перемещения указателя мыши, скажем на 3 стоку, надо указать координату 8*3 = 24 (на одну строку в текстовом режиме идет 8 пикселей. Установка указателя мыши в нужную позицию Для установки указателя мыши в нужную позицию (X,Y) используйте следующую процедуру: Procedure GotoMouseXY(x,y:word); assembler; Не забудте умножить координаты на 8, если вы используете текстовый режим! Регистрация события нажатия клавиши. В модуль CRT включена очень полезная функция, возвращающая true, если была нажата клавиша, вот ее аналог для мыши. Функция возвращает true, если была нажата любая клавиша. Function MousePressed: Boolean; Определение количества нажатий клавиш Для определения количества нажатия кнопок мыши используют функцию $05. Следующая функция возвращает количество нажатий левой(при num=0), средней(при num=2),правой(при num=1) кнопкой мыши с момента последнего вызова данной процедуры. И еще они возвращают координаты мыши при последнем нажатии данной клавиши. Function getnum(num:word; var x,y:word):word; Например, если надо получить координаты мыши при последнем нажатии левой кнопки мыши, достаточно вызвать процедуру так: getnum(0,x,y); Для такого вызова функции, включите расширенный синтаксис директивой компилятору {$X+} или в настройках компилятора. Пределы перемещения указателя Если в программе требуется ограничить область перемещения указателя, то для этого необходимо использовать функции $07 и $08. Ограничение перемещения указателя по горизонтали. Procedure LimHor(max,min:word); assembler; Ограничение перемещения указателя по вертикали. Procedure LimVer(max,min:word); assembler; Чтение содержимого счетчиков перемещения мыши эта операция возвращает величины смещения мыши по вертикали и горизонтали (в микки) со времени последнего вызова процедуры. Procedure GetMikki(var x,y:integer); |
![]() ![]() |
Altair |
![]()
Сообщение
#2
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
FAQ ...
... Изменение вида курсора в графическом режиме. Альтернативный вариант - пишем свой драйвер на паскале. Одна из функций прерывания $33 -$0C служит для определения пользовательской процедуры, которая будет вызываться при возникновении прерывания $33 если буду выполнять условия, заданные в маске. Маска -это двоичное число, каждый бит которого представляет логическую функцию условия. маски: Цитата бит 0 вызов при перемещении мышки бит 1 вызов при нажатии левой кнопки бит 2 вызов при отпускании левой кнопки бит 3 вызов при нажатии правой кнопки бит 4 вызов при отпускании правой кнопки бит 5 вызов при нажатии средней кнопки бит 6 вызов при отпускании средней кнопки бит 7 зарезервирован (оставить 0) бит 8 зарезервирован (оставить 0) При выходе из прикладной программы все вызовы должны быть запрещены ( т.е. все биты должны равняться 0 ), иначе следующее прерывание мышки ( перемещения, нажатия на клавиши ) приведет к обращению к освободившейся памяти, что, как вы уже догадались, вызовет непредсказуемые последствия. ------------------------------------------------------------ Реализация. Я взял для демонстрации приема замены обработчика на свой - мой модуль, выложенный на сайте (ссылка выше). Немного изменим его. В секцию INTERFACE модуля, добавим вот такой код: const Это описание вида курсора. (примитивно...) и добавим процедуру Procedure SetMouseEventManager; Теперь в секцию IMPLEMENTATION добавим в самое начало: Var и внизу опишем процедуры (2 - одна из них открыта для использования в основной программе, другая - сам обработчик). Procedure SetMouseEventManager; Я привел код процедуры из модуля но с комментариями. ------------------------------------------------------------ ВАЖНО! Включите в настройках компилятора : Цитата 286 instructions ------------------------------------------------------------ Все остальное можете посмотреть в коде, который я присоединил к сообщению. Я не старался улучшить этот модуль, доведя этот способ замены обработчика до совершенства, так как вряд-ли это кому-то нужно... Все это лишь эксперименты... Как Вы наверно заметили, этот способ довольно сложен, т.к. требует написания обработчика почти исключительно на ассемблере. так например стоит нам попробовать вызвать процедуру writeln из обработчика, произойдет ошибка Run-Time Error 1795 - вообще недокументированная :) Одним словом, результат работы чуть неправильно составленного обработчика может быть непредсказуем. Тот код что я предоставил - стабилен, я его протестировал, но пока тестировал - Windows 2000 раз 6 останавливала работу эмулятора ДОС из-за разных ошибок. Это недостатки метода. Теперь преимущества метода. Теоретически, используя этот метод, можно выводить 16 цветные курсоры любой формы. Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 7:22 |