TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

4.1. ВЗАИМОДЕЙСТВИЕ С ДРАЙВЕРОМ МЫШИ

Большинство аппаратных устройств, входящих в состав ПК, комплектуется драйверами — особыми программами, с помощью которых реализуется взаимодействие с аппаратурой на физическом уровне. Не является исключением и мышь: разработанный д^я нее фирмой Microsoft драйвер берет на себя всю черновую работу, связанную с обслуживанием устройства, предоставляя пользователю простые и удобные средства взаимодействия, с ним. Драйвер Microsoft для мыши является своеобразным стандартом для драйверов этого типа. Ниже рассматриваются его функции.

Драйвер представляет собой достаточно сложную программу, состоящую из двух основных частей — монитора мыши и монитора экрана.

Перемещение мыши измеряется в шагах. Шаг — это минимальное расстояние, регистрируемое датчиками мыши. Обычно разрешающая способность датчиков соответствует 8 шагам на миллиметр, т.е. величина шага составляет 0.125 мм. Существуют устройства, имеющие более высокую точность — до 16 шагов на миллиметр. Монитор мыши подсчитывает число шагов в каждом направлении и преобразует их в эквивалентное количество элементов изображения виртуального экрана. Элементы изображения определяются из стандартного текстового режима 80х25 путем умножения координат на 8, т.е. виртуальный экран — это максимальное разрешение CGA—адаптера в графическом режиме — 640х200. Координаты мыши могут выходить за пределы виртуального экрана, если реальный адаптер имеет более высокое разрешение.

Монитор экрана следит за соответствием положения указателя мыши на физическом экране текущим виртуальным координатам, полученным от монитора мыши. Поскольку дисплей может работать в различных режимах (текстовом или графическом), монитор экрана опрашивает текущий режим адаптера с помощью прерывания $10 и автоматически меняет изображение указателя при смене режимов. При быстрых перемещениях мыши монитор экрана может не успевать менять положение указателя на экране, поэтому драйвер следит также за скоростью смещения. Если эта скорость превосходит некоторую пороговую величину, драйвер удваивает число шагов, соответствующих одному и тому же линейному перемещению

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

Создаваемое драйвером стандартное изображение указателя на экране соответствует инверсному прямоугольнику в текстовом режиме (т.е. прямоугольнику, цвет которого определяется операцией NOT, примененной к байту атрибутов текущего символа) и направленной справа-налево и снизу—вверх стрелкой — в графическом режиме. Этот указатель может меняться по требованию программы.

Доступ к функциям драйвера мыши реализуется с помощью прерывания $33 MS-DOS. В табл.4.1 описываются функции этого прерывания так, как они реализованы в драйвере мыши фирмы Microsoft.

Таблица 4.1

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

 

Функция

Назначение

$00

Сбросить драйвер

$01

Показать указатель мыши

$02

Убрать указатель мыши

$03

Получить текущие координаты мыши и состояние ее кнопок

$04

Переместить указатель в новое положение

$05

Получить информацию о нажатии кнопки

$06

Получить информацию об отпускании кнопки

$07

Установить область перемещения указателя по горизонтали

$08

Установить область перемещения указателя по вертикали

$09

Задать форму указателя для графического режима

$ОА

Задать форму указателя для текстового режима

$ОВ

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

$ОС

Задать условия вызова программы пользователя

$OD

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

$OE

Выключить эмуляцию светового пера

$OF

Установить отношение числа шагов на единицу виртуального экрана

$13

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

$14

Заменить процедуру пользователя

$15

Получить размер буфера, необходимого для сохранения состояния драйвера

$16

Сохранить текущее состояние драйвера

$17

Восстановить состояние драйвера

$1D

Задать видеостраницу для отображения указателя

$1Е

Получить номер видеостраницы, в которой отображается указатель


Сбросить драйвер

Вход: АХ = О

Выход: АХ — состояние мыши и драйвера:

$ О О О О — мышь или драйвер не установлены;

$ FFFF — сброс осуществлен, драйвер и мышь установлены;

ВХ — количество кнопок у мыши:

О — число кнопок отлично от двух;

2 — две кнопки;

3 — три кнопки.

После обращения к функции $00 все параметры драйвера принимают значения по умолчанию: устанавливается стандартная форма указателя

(прямоугольник или стрелка — в зависимости от текущего режима работы дисплея); указатель помещается в центр экрана и его изображение гасится;

с указателем связывается видеостраница 0; драйвер автоматически определяет текущее разрешение экрана и устанавливает максимально возможную область перемещения указателя. Обычно эта функция вызывается после смены режима работы дисплея.

Показать указатель мыши

Вход: АХ = 1.

Функция $01 показывает указатель на экране. Поскольку драйвер отслеживает перемещения мыши и при погашенном указателе, последний может появиться в любом месте экрана — не обязательно там, где был погашен.

Убрать указатель мыши

Вход: АХ = 2.

Функция $02 гасит указатель мыши. Эту функцию следует вызывать перед каждым использованием прямого доступа к видеопамяти. Дело в том, что драйвер запоминает состояние видеопамяти перед выводом указателя на экран и восстанавливает это состояние при перемещении указателя в новое место. Если перед непосредственной записью данных в видеопамять не погасить указатель, драйвер выведет на экран неверный символ при смещении мыши. Точно так же при непосредственном считывании данных из видеопамяти можно считать указатель мыши вместо соответствующего символа.

Следует иметь в виду, что драйвер наращивает на единицу внутренний счетчик всякий раз, когда вызывается функция $02, и уменьшает этот счетчик при вызове функции $01. Указатель становится виден только в том случае, когда этот счетчик равен 0, поэтому вызов функций $01 и $02 может не привести к желаемым результатам, если нарушено соответствие вызовов.

Получить текущие координаты мыши и состояние ее кнопок

Вход: АХ = 3. Выход: ВХ — байт состояния кнопок:

биты 0 — левая кнопка;

1 — правая кнопка;

2 — средняя кнопка;

(1 соответствует нажатой кнопке, 0 — отпущенной);

СХ — горизонтальная координата мыши;

DX — вертикальная координата.

Функция $03 дает исчерпывающую информацию о текущем состоянии мыши: состояние кнопок указывается битами регистра ВХ, в то время как в регистрах СХ и DX возвращаются текущие координаты указателя. Координаты указателя соответствуют виртуальному экрану. На практике они с о держа г положение координатной точки (пиксела) указателя в графи—

ческом режиме или умноженные на 8 координаты в текстовом режиме (отсчет координат от 0). Таким образом, чтобы перевести виртуальные координаты в координаты позиция — колонка, нужно разделить полученные значения на 8 и добавить к ним по единице (текстовые координаты в Турбо Паскале отсчитываются от 1). Для графического режима такой пересчет обычно не нужен.

Переместить указатель в новое положение

Вход: АХ = 4;

CX,DX — требуемые виртуальные координаты (X,Y) мыши. Функция $04 устанавливает указатель мыши в заданную точку экрана. функция получает виртуальные координаты, поэтому при обращении к ней координаты текстового экрана должны уменьшаться на единицу и умножаться на 8. Виртуальные координаты требуемого положения указателя должны находиться в прямоугольнике, ограниченном обращениями к функциям $07 и $08.

Получить информацию о нажатии/отпускании кнопки

Вход: АХ = 5 — получить информацию о нажатии;

= 6 — получить информацию об отпускании;

ВХ — идентификатор нужной кнопки

(биты О, 1, 2 выбирают соответственно

левую, правую и среднюю кнопку). Выход:АХ — текущее состояние кнопок (см. ВХ в функции $03);

ВХ — количество нажатий (отпусканий) указанной кнопки

после последнего вызова функции $05 ($06);

CX,DX — виртуальные координаты мыши (X,Y), соответствующие

последнему нажатию (отпусканию) кнопки. Функции $05 и $06 дают информацию о том, сколько раз нажималась (отпускалась) нужная кнопка мыши, какая (какие) кнопки нажаты в данный момент и координаты той точки, где указанная кнопка нажималась (отпускалась) в последний раз. После обращения к этим функциям сбрасываются внутренние счетчики драйвера, поэтому полученная информация соответствует интервалу времени, прошедшему от момента последнего вызова соответствующей функции.

Установить область перемещения указателя по горизонтали (вертикали)

Вход: АХ = 7 — по горизонтали;

= 8 — по вертикали;

СХ — минимальная координата;

DX — максимальная координата.

Функции $07 и $08 определяют границы прямоугольной области соответственно по горизонтали и вертикали, в пределах которой может перемещаться указатель мыши. После вызова функции курсор автоматически помещается в указанную область, если он находится вне ее. Если

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

Задать форму указателя для графического режима

Вход: АХ = 9

ВХ — положение координатной точки от левого края изображения;

СХ — положение координатной точки от верхнего края

изображения;

ES:DX — адрес битового поля [ES — сегментная часть адреса). Функция $09 определяет форму графического указателя. По умолчанию этот указатель имеет вид стрелки, ориентированной слева—направо и снизу вверх, причем координатная точка указателя соответствует острию стрелки. Программа может с помощью этой функции задать другую форму указателя. При обращении к функции регистры ES:DX должны содержать адрес 64—байтного массива, который трактуется следующим образом. Первые 16 двухбайтных слов рассматриваются как битовая маска 16х16, каждый бит которой маскирует пикселы экрана (эти байты называются маской экрана); вторые 16 слов — матрица 16х16 бит для формирования изображения указателя (маска изображения). Размер указателя на графическом экране всегда составляет 16х16 пиксел. При создании изображения драйвер предварительно получает информацию о 16х16 пикселах соответствующего места экрана и к каждому пикселу применяется операция AND с маской экрана, а затем к полученному результату — операция XOR с маской изображения. Например, если маска экрана содержит одни нули, на экране будет вырезан пустой прямоугольник 16х16 пиксел и в него без изменения помещается маска изображения — это вариант «непрозрачного» указателя. Наоборот, если маска экрана состоит из битовых единиц (слова со значением $FFFF), изображение указателя взаимодействует с экранным изображением в режиме XORPut («прозрачный» указатель). Расположение сформированного указателя относительно виртуальных координат мыши определяется смещением координатной точки относительно левого и верхнего краев маски экрана. Если, например, ВХ = СХ = 0, координатная точка соответствует левому верхнему углу маски, поэтому изображение указателя размещается правее и ниже виртуальных координат указателя, если ВХ == СХ = 8, координатная точка соответствует центру изображения.

Задать форму указателя для текстового режима

Вход: АХ == $ОА;

ВХ — флаг указателя:

О — программное управление формой;

1 — аппаратное управление формой;

СХ — маска экрана для ВХ=0 или верхняя строка развертки дляВХ=1;

DX — маска указателя для ВХ=0 или нижняя строка развертки

дляВХ=1.

Функция $ОА управляет формой указателя в текстовом режиме. При обращении к ней программа имеет две возможности: определить форму программным способом (ВХ^О) или аппаратным (BX=lj. Аппаратная форма указателя соответствует стандартному мигающему курсору. Замечу, что сам текстовый курсор в этом случае не меняет своего положения, но становится невидимым, так как мигающее изображение соответствует указателю мыши (если указатель погасить, курсор вновь станет виден). Если выбрана аппаратная форма, регистры СХ и DX содержат номера строк развертки, ограничивающих изображение. Эти координаты задаются в диапазоне О...7. Если СХ=0 и DX=7, изображение представляет собой мигающий прямоугольник максимальных размеров; стандартный курсор задается значениями СХ=6 и DX=7. В случае программного управления формой в СХ и DX должны содержаться маски экрана (СХ) и символа (DX). Истинное изображение указателя в этом случае определяется следующим образом: читается слово из видеопамяти, куда должен будет помещен указатель; к этому слову применяется операция AND с маской экрана, а к результату — операция XOR с маской символа; окончательный результат помещается в видеопамять.

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

Вход: АХ = $ОВ.

Выход: CX,DX — количество шагов по горизонтали (СХ) и

вертикали (DX) после последнего вызова функции $ОВ.

С помощью функции $ОВ можно получить суммарное количество шагов, на которые смещалась мышь по каждой координате за время, прошедшее с момента последнего вызова функции. Положительные значения соответствуют смещениям вправо и вниз, отрицательные — влево и вверх. Обращение к функции сбрасывает внутренние счетчики драйвера.

Задать условия вызова программы пользователя

Вход: АХ = $ОС;

СХ — условия вызова; определяются единичными значениями разрядов регистра при следующих событиях:

биты 0 — мышь перемешается;

1 — нажимается левая кнопка;

2 — отпускается левая кнопка;

3 — нажимается правая кнопка;

4 — отпускается правая кнопка;

5 — нажимается средняя кнопка;

6 — отпускается средняя кнопка;

ES:DX — адрес программы пользователя (ES — сегмент). Функция $ОС определяет условия вызова внешней процедуры, с помощью которой программа может реагировать на манипуляции с мышью в момент, когда происходит то или иное событие. Драйвер мыши постоянно находится в оперативной памяти ПК и получает управление при каждом изменении состояния мыши. функция $ОС сообщает драйверу адрес

процедуры и условия ее вызова: в момент возникновения указанного события драйвер вызывает эту процедуру, которая должна транслироваться в расчете на дальнюю модель памяти (с ключом FAR]. При вызове процедуры в регистрах центрального процессора содержатся следующие данные:

AX — маска условий (то же слово, которое передается функции $ОС в регистре СХ);

ВХ — состояние кнопок, как это определено для функции $03;

CX,DX — виртуальные координаты курсора;

DI.SI — число шагов мыши по горизонтали и вертикали;

DS — сегмент данных драйвера мыши.

Программа может использовать эти регистры по своему усмотрению. Работа программы завершается командой FAR RET.

Замечу, что при вызове программы пользователя регистр DS содержит сегмент данных драйвера мыши. Этот сегмент никогда не соответствует сегменту данных Турбо Паскалевой программы, поэтому процедура пользователя должна реализовываться с помощью встроенного ассемблера (см. процедуру MouseHandler в модуле F_Mouse).

Включить (выключить) эмуляцию светового пера

Вход: AX = $OD — включить;

= $ОЕ — выключить

С помощью функции $OD включается, а функцией $ОЕ выключается режим эмуляции светового пера. В языке программирования MS Basic предусмотрен оператор PEN, с помощью которого можно получить доступ к световому перу. Эмуляция светового пера включается драйвером по умолчанию. Если в ПК есть это устройство, режим эмуляции необходимо отключить.

Установить отношение числа шагов на единицу виртуального экрана

Вход: AX = $OF;

CX,DX — количество сотых долей дюйма по горизонтали (СХ) и вертикали (DX) на 8 единиц виртуального экрана (на 8 пиксел).

Функция $OF позволяет задать масштабные коэффициенты пересчета перемещения мыши в виртуальные координаты экрана. По умолчанию драйвер устанавливает значения этих коэффициентов, равные 8, т.е. каждый пиксел экрана соответствует 8 сотым долям дюйма (2,032 мм) линейного перемещения мыши. Чем большее значение задается этими коэффициентами, тем меньше смещается на экране указатель мыши при одном и том же ее перемещении.

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

Вход: АХ = $13;

DX — новое значение порога удвоения скорости.

Заменить процедуру пользователя

Вход: АХ •= $14.

Остальные регистры такие же, как и при вызове функции $ОС. Выход: СХ — условия вызова ранее установленной процедуры;

ES'.DX — адрес этой процедуры.

При переходе из одного режима работы программы в другой бывает необходимо запомнить текущее состояние драйвера, чтобы при возврате в старый режим восстановить это состояние. Эти действия реализуются функциями $14, $15, $16 и $17. Функция $14 реализует те же действия, что и функция $ОС, т.е. задает адрес и условия вызова процедуры пользователя, но при выходе из нее в регистрах СХ и ES'.DX содержатся условия вызова и адрес ранее установленной процедуры.

Получить размер буфера, необходимого для сохранения состояния драйвера

Вход: АХ = $15;

ВХ == 0.

Выход: ВХ — размер буфера в байтах. См. пояснения к функции $14.

Сохранить текущее ^.состояние драйвера

Вход: АХ = $16;

ES-.DX — адрес буфера (?5 — сегмент). См. пояснения к функции $14.

Восстановить состояние драйвера

Вход: АХ = $17;

ES'.DX — адрес буфера (ES — сегмент). См. пояснения к функции $14.

Задать видеостраницу для отображения указателя

Вход: АХ = $1D;

ВХ — номер видеостраницы (от 0). См. пояснения к функции $1Е.

Получить номер видеостраницы, в которой отображается указатель

Вход: АХ = $1Е. Выход: ВХ — номер видеостраницы (от 0).

При работе с несколькими видеостраницами могут оказаться полезными функции $1D и $1Е. С помощью первой выбирается нужная видеостраница, в которой будет отображаться указатель мыши, вторая позволяет определить номер страницы с указателем.

Глава 4

Оглавление

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz