Взаимодействие с драйвером мыши

Мышь - манипулятор, движение которого по столу или другой поверхности преобразуется в перемещение специального курсора мыши на экране. С ее помощью мы можем «указать» на какую-либо область экрана и, нажимая клавиши мыши, заказать некоторую обработку.

Для управления мышью программы, написанные на 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; просмотров: 937;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.034 сек.