Взаимодействие с драйвером мыши
Мышь - манипулятор, движение которого по столу или другой поверхности преобразуется в перемещение специального курсора мыши на экране. С ее помощью мы можем «указать» на какую-либо область экрана и, нажимая клавиши мыши, заказать некоторую обработку.
Для управления мышью программы, написанные на Borland Pascal, используют драйвер мыши, предоставляемый BIOS. Вызов этого драйвера осуществляется через инициацию прерывания с номером 3316 = 5110 (int 33h -на ассемблере).
Драйвер мыши реализует выполнение основных операций с мышью:
§ инициализирует мышь (с проверкой наличия);
§ устанавливает курсор мыши в заданное место экрана;
§ определяет местоположение курсора мыши и состояния ее клавиш (нажаты или нет);
§ управляет видимостью курсора мыши.
К сожалению, библиотеки Borland Pascal не включают функций обращения к драйверу мыши, и его вызов приходится осуществлять через процедуру активизации обработчиков прерываний, определенную в модуле Dos.
Процедура Intr(numInt:byte; Var Regs:Register) - активизирует обработчик прерывания с номером numInt. Через параметр Regs типа Registers организуется доступ к содержимому регистров (внутренней памяти) процессора:
Type Registers = record case Integer of
0: (AX,BX,CX,DX,BP,SI,DI,DS,ES, Flags: word);
1: (AL,AH,BL,BH,CL,CH,DL,DH:byte);
end;...
Обмен данными между программой и драйвером мыши выполняется через регистры, указанные в описании драйвера. Так, номер вызываемой функции помещается в регистр АХ, а для передачи или получения дополнительной информации используются регистры СХ, DX.
Ниже приводится текст модуля, содержащего ресурсы, которые обеспечивают доступ к драйверу мыши.
Unit Mouse;
{---------------------------------------------------------------------------}
Interface
Uses Dos;
Function ResetMouse: boolean;
Procedure ShowMouseCursor;
Procedure HideMouseCursor;
Procedure ReadMouseState(var x, y: integer; var LeftButton, MiddleButton, RightButton: boolean);
Procedure MoveMouseCursor(x, y: integer);
{---------------------------------------------------------------------------}
Implementation
Function ResetMouse: boolean;
var r: registers;
begin
r.AX := 0;
intr($33, r);
ResetMouse := r.AX=$FFFF;
end;
Procedure ShowMouseCursor;
var r: registers;
begin
r.AX := 1;
intr($33, r);
end;
Procedure HideMouseCursor;
var r: registers;
begin
r.AX := 2;
intr($33, r);
end;
Procedure ReadMouseState (var x, y: integer; var LeftButton, MiddleButton, RightButton: boolean);
var r: registers;
begin
r.AX := 3;
intr($33, r);
x := r.CX;
y := r.DX;
LeftButton := (r.BX and 1) <> 0;
RightButton := (r.BX and 2) <> 0;
RightButton := (r.BX and 4) <> 0;
end;
Procedure MoveMouseCursor(x, y: integer);
var r: registers;
begin
r.AX := 4;
r.CX := x;
r.DX := y;
intr($33, r);
end;
End.
Разработка программ, использующих мышь, имеет свои особенности. В отличие от клавиатуры, ввод информации с которой осуществляется пользователем по запросу программы, состояние мыши (перемещение и положение клавиш) может изменяться пользователем в любой момент времени, независимо от программы. Следовательно, программы, работающие с мышью, должны циклически опрашивать состояние мыши и при его изменении осуществлять требуемые операции.
На рис. 1 показано, как программа определяет моменты нажатия и отпускания клавиш (при выполнении опроса, если клавиша нажата, переменной Left присваивается значение true, а если - не нажата, то false).
Учитывать приходится также режим экрана, который использует программа, так как координаты курсора мыши на экране и в текстовом и в графическом режимах определяются в пикселях.
Взаимодействие с мышью в текстовом режиме. Координаты мыши при работе с ней в текстовом режиме необходимо пересчитывать, причем независимо от реального размера знакоместа считается, что оно имеет размер 8x8 пикселей.
Пример. Разработать программу, демонстрирующую особенности использования мыши в текстовом режиме. При нажатии левой клавиши мыши программа должна высвечивать координаты точки. Выход осуществить при нажатии левой клавиши мыши, когда ее курсор находится в окне «Конец» (рис. 2).
Управление разрабатываемой программой будет реализовано только посредством мыши. Вначале проверим наличие мыши, нарисуем окно Конец («кнопка»), установим курсор в левый верхний угол экрана. Затем будем отслеживать перемещение курсора мыши и нажатие ее левой клавиши. Если клавиша нажата, то определяем местоположение курсора, проверяем, не находится ли он над окном Конец, и если нет, то выводим его координаты. После этого ожидаем отпускания клавиши, чтобы повторно не выводить координаты курсора.
Рис. 1. Вид экрана в процессе работы программы
Uses crt, mouse;
Var x, y, xt, yt: integer;
l, m, r, exit_m: boolean;
Begin
clrscr;
if not ResetMouse then begin
writeln('');
halt(1);
end
else writeln ('');
ShowMouseCursor;
MoveMouseCursor(0,0);
Window(70,1,80,3);
TextAttr:=16*1+14;
Clrscr;
Gotoxy(2,2);
Write('');
Window(1,1,80,25);
Gotoxy(1,3);
TextAttr:=5*16+9;
repeat
ReadMouseState(x, y, l, m, r);
if l then begin
xt:=x div 8+1;
yt:=y div 8+1;
exit_m := (xt>=70) and (xt<=80) and (yt>=1) and (yt<=3);
if not exit_m then begin
gotoxy(xt,yt);
HideMouseCursor;
write('x=', xt:4, 'y=', yt:4);
ShowMouseCursor;
end;
repeat ReadMouseState(x,y,l,m,r) until not l;
end;
until exit_m and l;
TextAttr:=7;
ClrScr;
End.
Взаимодействие с мышью в графическом режиме. При использовании мыши в графическом режиме также приходится выполнять циклический опрос состояния мыши для определения момента нажатия клавиши.
Пример 2. Разработать программу рисования мышью при нажатой левой клавише: точка рисуется при каждом опросе состояния мыши, если клавиша остается нажатой. Реализовать двойное управление (с клавиатуры и мышью): выход – при нажатии мышью кнопки Exit на экране или клавиши Esc на клавиатуре.
Uses Mouse, Crt, Graph;
var
x, y: integer;
l, m, r: boolean;
driver, mode: integer;
ch: char;
exit_m: boolean;
Procedure Button(x1, y1, x2, y2: integer; s: string);
begin
setcolor(0);
setfillstyle(1, 8);
bar(x1, y1, x2, y2);
setfillstyle(1, 7);
bar(x1+2, y1+2, x2-3, y2-3);
setfillstyle(1, 15);
bar(x1, y1, x1+1, y2);
bar(x1+2,y1+1, x1+2, y2-1);
bar(x1, y1, x2, y1+1);
bar(x1+1, y1+1, x2-1, y1+2);
setcolor(4);
settextstyle(1, 0, 3);
outtextxy(x1+20, y1+3, s);
end;
Begin
clrscr;
if not ReSetMouse then begin
writeln('mouse not found.');
halt(1);
end;
driver:=detect;
InitGraph(driver, mode, '');
setcolor(4);
outtextxy(10,10,'Drawing with mouse:');
ShowMouseCursor;
setbkcolor(3);
button(500, 10, 600, 50, 'Exit');
repeat
if keypressed then ch := readkey
else begin
ReadMouseState(x, y, l, m, r);
exit_m := (x>=500) and (x<=600) and (y>=100) and (y<=50);
if not exit_m and l then begin
HideMouseCursor;
PutPixel(x, y, 4);
ShowMouseCursor;
end;
end;
until (exit_m and l) or (ch=#27);
repeat ReadMouseState(x,y,l,m,r) until not l;
closegraph;
End.
Лекция 29. Объектно-ориентированная методология разработки программ (4 часа)
Дата добавления: 2015-12-01; просмотров: 950;