![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Взаимодействие с драйвером мыши
Мышь - манипулятор, движение которого по столу или другой поверхности преобразуется в перемещение специального курсора мыши на экране. С ее помощью мы можем «указать» на какую-либо область экрана и, нажимая клавиши мыши, заказать некоторую обработку. Для управления мышью программы, написанные на 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 часа)
|