Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.