Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Манипуляторы (мышь, джойстик и др.) это специальные устройства, которые используются для управления курсором.
Мышь имеет вид небольшой коробки, полностью умещающейся на ладони. Мышь связана с компьютером кабелем через специальный блок адаптер, и её движения преобразуются в соответствующие перемещения курсора по экрану дисплея. В верхней части устройства расположены управляющие кнопки (обычно их три), позволяющие задавать начало и конец движения, осуществлять выбор меню и т.п.
Использование манипулятора "мышь".
В ИИО TP реализована полная поддержка работы с манипулятором "мышь". Перемещая по столу "мышку" вы быстро найдёте на экране специальный мышиный курсор. Указав этим курсором на нужный Вам раздел меню или подменю и нажав указательным пальцем левую кнопку мыши, Вы войдёте в этот раздел (пробуйте).
Используя манипулятор мышь, можно управлять уже открытыми окнами не используя главное меню. Для этого на рамке окна размещены специальные символы. Если нажимать мышиным курсором на верх или низ, знакомых уже Вам полос скролинга, то текст будет перемещаться постранично и соответственно вверх или вниз, влево или вправо.
Закрыть окно можно нажав тем же мышиным курсором на символ, размещённый вверху слева на рамке окна.
Распахнуть окно, или вернуть ему прежние размеры можно нажав мышиным курсором на символ размещённый рядом с номером окна.
Перемещать окно по экрану можно с помощью мышки, нажав и удерживая мышиный курсор на верхней части рамки окна.
Изменять размеры окна можно используя правый нижний угол окна. Он всегда зелёного цвета. Необходимо просто нажать на него мышиным курсором и удерживая его перемещать мышку по экрану.
Правила работы программы с мышью
Сначала нужно проверить поддерживается ли мышь на данной ЭВМ. Для этого используется функция с номером 0. Эта функция проверяет, имеется ли поддержка мыши на данной ЭВМ, и если имеется, то в регистр AX будет записано число $FFFF. Если нет, то 0, но не обязательно. В регистр BX. В него записывается количество кнопок мыши.
Если мышь имеется, эта функция выполняет следующие действия в текстовом режиме
Если перед вызовом функции был установлен графический режим, то устанавливается указатель в виде стрелки для данного режима.
Внизу находится листинг первой простейшей программы, в которой проверяется, может ли программа получить доступ к мыши. Если "да", то программа входит в цикл, из которого выходит либо по нажатию любой клавиши на клавиатуре, либо по нажатию любой кнопки мыши.
Для того, чтобы определить, не произошло ли чего с мышью, в этой программе используется функция с номером 3 "Опросить положение и состояние кнопок".
Синтаксис функции 3 прерывания $33: опрос положения курсора и состояния кнопок. Здесь reg - переменная типа REGISTERS |
|
При вызове |
AX = 3 |
Возвращает |
биты регистра BX заполнены в соответствии с правилом:
|
CX = X координата (горизонтальная) курсора мыши. Для текстового экрана нужно делить на 8, |
|
DX = Y координата (вертикальная) курсора мыши. Для текстового экрана нужно делить на 8, |
В данном случае мы только опрашиваем состояние левой и правой кнопок. Если нажата любая из них, программа завершает работу.
program mouse_01;
uses DOS, CRT;
var
r: Registers;
BEGIN
r.ax:=0;
intr($33, r);
if r.ax <> $FFFF then
begin
WriteLn('Мышь не обнаружена'); Halt(1)
end;
Writeln('Обнаружена мышь. Число кнопок = ',r.bx);
r.ax:=1; {Покажем указатель мыши}
intr($33, r);
repeat
r.ax:=3;
intr($33, r);
until KeyPressed or (r.bx and 3 <> 0);
END.
Теперь, когда убедились в том, что с мышью все в порядке, что-нибудь сделаем посложнее. Например, определим, какой символ находится под указателем мыши, когда нажимаем левую кнопку мыши. Листинг программы приводится ниже. В ней все практически все то же, за исключением некоторых моментов:
program mouse_02;
uses DOS, CRT;
var
r: Registers;
x, y: Word;
BEGIN
r.ax:=0;
intr($33, r);
if r.ax <> $FFFF then
begin
WriteLn('Мышь не обнаружена'); Halt(1)
end;
Writeln('Мышь обнаружена с ',r.bx,' кнопками');
r.ax:=1;
intr($33, r);
repeat
r.ax:=3;
intr($33, r);
if r.bx and 1 <> 0 then
begin
x:=r.cx div 8;
y:=r.dx div 8;
r.ax:=2; intr($33, r);
gotoXY(1,1);
Write(x:2,' ', y:2,' ',chr(mem[SegB800:y*160+x*2]),'');
r.ax:=1; intr($33, r);
end;
until KeyPressed or (r.bx and 2 <> 0);
END.
В качестве примера использования ресурсов модуля Dos рассмотрим модуль, содержащий подпрограммы работы с "мышью" и программу, использующую подпрограммы этого модуля и позволяющую рисовать на экране траекторию перемещения курсора "мыши".
Пример.
{ Модуль с подпрограммами мыши }
unit Mouse;
interface
var MousePresent: Boolean; {Признак наличия мыши}
function MouseInit(var nb: Integer): Boolean;
{Инициализация мыши}
{nb - количество клавиш мыши;
значение функции:
True - инициализация прошла успешно,
False - в противном случае }
procedure MouseShow; {Показать курсор мыши}
procedure MouseHide; {Спрятать курсор мыши}
procedure MouseRead(var X, Y, bMask: Word);
{Определить текущие координаты курсора и состояние клавиш мыши}
{X,Y - координаты курсора мыши;
bMask - маска клавиш:
0-й байт - левая клавиша (1 - если нажата),
1-й байт - правая клавиша (1 - если нажата),
2-й байт - центральная клавиша, если она присутствует (1 - если нажата) }
procedure MouseSetPos(X, Y: Word);
{Установить координаты мыши}
{X,Y - задаваемые координаты мыши }
function MouseGetb(bMask: Word;
var Count,LastX,LastY: Word): Word;
{Определить состояние клавиши}
{bMask - маска клавиш - то же, что и в процедуре MouseRead, здесь необходимо записать единицу в байт, соответствующий проверяемой клавише;
Count - количество нажатий клавиши;
LastX,LastY - координаты последнего нажатия клавиши;
значение функции:
бит 0 равен 1, если нажата левая клавиша,
бит 1 равен 1, если нажата правая клавиша }
implementation
uses Dos;
var R: Registers; {Стандартный тип модуля Dos}
Mi: Pointer;
function MouseInit(var nb: Word): Boolean;
begin
if MousePresent then
begin {Мышь присутствует}
R.AX := 0;
Intr($33, R)
if R.AX = 0 then
begin {Инициализация не удалась}
nb := 0;
MouseInit := False
end
else
begin {Инициализация удалась}
nb := R.BX; {Число клавиш}
Mouselnit := True
end
end
else
begin {Мышь отсутствует}
nb := 0;
Mouselnit := False
end
end;
procedure MouseShow;
begin
R.AX := 1;
Intr($33, R)
end;
procedure MouseHide;
begin
R.AX := 2;
Intr($33, R)
end;
procedure MouseRead(var X, Y, bMask: Word);
begin
R.AX := 3;
Intr($33, R);
X := R.CX;
Y := R.DX;
bMask := R.BX
end;
procedure MouseSetPos(X, Y: Word);
begin
R.AX := 4;
R.CX :- X;
R.DX := Y;
Intr($33, R)
end;
function MouseGetb(bMask: Word;
var Count, LastX, LastY: Word): Word;
begin
R.AX := 5;
R.BX := bMask;
Intr($33, R);
Count := R.BX;
LastX .= R.CX;
LastY := R.DX;
MouseGetb := R.AX
end;
{ Секция инициализации }
begin
GetIntVec($33, Mi);
if Mi = nil then
MousePresent := False {Нет адреса программы обработки
прерываний}
else
if Byte(Mi^) = $CE then
MousePresent := False {Фиктивный адрес программы обработки прерываний}
else
MousePresent := True {Присутствует программа обработки прерываний}
end.
{ Основная программа }
program EXAMPLE30;
uses Crt, Mouse;
var X, Y, BN, NB: Word;
begin
TextBackGround(Blue);
ClrScr;
TextColor(Red);
if Mouselnit(NB) then
begin
MouseShow;
repeat
MouseRead(X, Y, BN);
if BM and 1 <> 0 then
begin {Нажата левая клавиша}
X := X div В + 1;
Y := Y div В + 1;
GotoXY(X, Y);
Write(' * ')
end
until BM and 2 <> 0 {Выход при нажатой правой клавише}
end
end.
В этом примере в модуле Mouse приведены некоторые подпрограммы, которые не используются в основной программе (MouseHide, MouseSetPos, MouseGetb), но они могут быть полезны в других приложениях. Здесь используется ряд стандартных подпрограмм модуля Dos (GetlntVec, Intr), а также стандартный тип модуля Registers.
"Мышь" работает с номером прерывания $33. Во всех случаях обращения к подпрограмме выполнения прерывания Intr параметры передаются в подпрограмму и обратно в вызывающую программу через соответствующие регистры. В приведенном модуле используется секция инициализации, в которой проверяется наличие программы обработки прерываний от "мыши".