МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НУ "ЛЬВІВСЬКА ПОЛІТЕХНІКА"
кафедра ПЗ
Курсова робота
з предмету „Об'єктно-орієнтовані мови програмування ”
На тему: „Модуль мишки”
Зміст
Вступ 3
1. Формулювання задачі 4
1.1. Системна структура миші 4
1.2. Скидання драйвера 5
1.3. Показати вказівник миші 6
1.4. Забрати вказівник миші 6
1.5. Отримання поточних координат миші і стан її кнопок 6
1.6. Переміщення вказівника в нове положення 7
2. Опис програми 8
3. Інструкція користувачу 10
Висновки 12
Література 13
Додатки 14
Додаток 1. Модуль для роботи з мишкою 14
Додаток 2. Текст демонстраційної програми 15
Вступ
Стрімкий розвиток комп'ютерних технологій приводить до розвитку пристроїв, що взаємодіють з ними. З кожним роком розробляються новітні технології, які з часом реалізовуються у виробництві. До великої частки розробок, які стосуються комп'ютерної галузі, відносяться пристрої вводу інформації. Для виготовлення таких пристроїв, велику увагу звертають на швидкість вводу інформації, простоту та вигідність, а також економічні фактори виробництва.
На даному етапі розвитку, компанії, що займаються виготовленням комп'ютерних пристроїв, досить часто розробляють нові та вдосконалюють вже існуючі розробки.
Маніпулятор миша є одним з найпоширенішим пристроєм вводу інформації, який модернізується. По своїй структурі, миша, є досить простим та дешевим пристроєм, оскільки має просту технологію виготовлення, а також є досить зручною в користуванні. Більшість апаратних пристроїв, які входять до складу ПК, комплектуються драйверами – особливими програмами, за допомогою яких реалізується взаємодія з апаратурою на фізичному рівні. Не винятком є і маніпулятор миша: розроблений для неї фірмою Microsoft. Цей драйвер є стандартом для драйверів такого типу. В курсовій роботі розглянемо основні принципи побудови драйвера миші та використання його на системному рівні.
1. Формулювання задачі
В курсовій роботі потрібно розробити модуль для роботи з мишкою, який дозволяє виконувати основні функції даного пристрою. Для роботи з мишкою на апаратному рівні потрібно використовувати прямий доступ до апаратних ресурсів, дані операції дозволяє виконувати мова програмування Assembler. Більшість мов програмування в свій синтаксис включають стандартні команди Assembler, не винятком є і Pascal. За допомогою цього компілятора напишемо модуль для роботи з мишкою, а також програму для демонстрації створеного модуля.
Далі розглянемо основні принципи роботи маніпулятора мишки.
Системна структура миші
Переміщення миші вимірюється в кроках. Крок – це мінімальна відстань, яка реєструється датчиками миші. Зазвичай дозволяюча здатність датчиків відповідає 8 крокам на міліметр, тобто величина складає 0,125 мм.. Існують пристрої, що мають більш високу точність – до 16 кроків на міліметр. Монітор миші підраховує число кроків на кожному напрямку і перетворює їх в еквівалентну кількість елементів зображення віртуального екрану. Елементи зображення визначаються з стандартного текстового режиму 80х25 шляхом множення координат на 8, тобто віртуальний екран – це максимальне розрішення CGA- адаптера в графічному режимі – 640х480. координати миші можуть виходити за границі віртуального екрану, якщо реальний адаптер має більше розрішення.
Монітор екрана слідкує за відповідністю положення вказівника миші на фізичному екрані поточним віртуальним координатам, отриманих від монітора миші. Оскільки дисплей може працювати в різних режимах (текстовому або графічному), монітора екрана опитує поточний режим адаптера за допомогою переривання $10 і автоматично міняє зображення вказівника при зміні режимів. При швидких переміщеннях миші монітор екрана може не встигати міняти положення вказівника на екрані, тому драйвер слідкує також за швидкістю зміщення. Якщо ця швидкість більша за деяку порогову величину, драйвер подвоює число кроків, які відповідають одному й тому ж лінійному зміщенні миші, в результаті вказівник починає зміщатись на екрані з подвоєною швидкістю.
Створене драйвером стандартне зображення вказівника на екрані відповідає інверсному прямокутнику в текстовому режимі (тобто прямокутнику, колір якого визначається операцією NOT, що застосовується до байту поточного символу) та направленою справа-наліво і знизу-вверх стрілкою – в графічному режимі. Цей вказівник може змінюватись по вимозі програми.
Доступ до функції драйвера миші реалізується за допомогою переривання $33 MS-DOS. В табл. 1,1, описуються функції переривання так, як вони реалізовані в драйвері миші фірми Microsoft.
Таблиця 1.1.
Функції драйвера миші
Функція
Призначення
$00
Скинути драйвер
$01
Показати вказівник миші
$02
Забрати вказівник миші
$03
Отримати поточні координати миші і стан її кнопок
$04
Перемістити вказівник миші в нове положення
$05
Отримати інформацію про натискання клавіші
$06
Отримати інформацію про відпускання клавіші
$07
Встановити область переміщення вказівника по горизонталі
$08
Встановити область переміщення вказівника по вертикалі
$09
Задати форму вказівника для графічного режиму
$0А
Задати форму вказівника для текстового режиму
$0B
Отримати лічильник кроків переміщення
$0C
Задати умову виклику програми користувача
$0D
Включити емуляцію світлового пера
$0E
Виключити емуляцію світлового пера
$0F
Встановити відношення числа кроків на одиницю віртуального екрана
$13
Встановити границю подвоєння швидкості зміщення вказівника миші
$14
Замінити процедуру користувача
$15
Отримати розмір буфера, потрібного для збереження стану драйвера
$16
Зберегти поточний стан драйвера
$17
Відновити стан драйвера
$1D
Задати відеосторінку для відображення вказівника
$1E
Отримати номер відеосторінки, в якій відображається вказівник
Скидання драйвера
Вхід: AX = 0
Вихід: AX-стан миші і драйвера:
$0000 – миша або драйвер не встановлені;
$FFFF – скид виконаний, драйвер і миша встановлені;
BX – кількість кнопок у миші
0 – число кнопок відмінна від двох
2 – дві кнопки;
3 – три кнопки.
Після звертання до функції $00 всі параметри драйвера приймають значення по замовчення: встановлюється стандартна форма вказівника (прямокутник або стрілка – в залежності від поточного режиму роботи дисплея); вказівник поміщається в центр екрану і його зображення гаситься; з вказівником зв’язується відеосторінка 0; драйвера автоматично визначає поточне розрішення екрану і встановлює максимально можливу область переміщення вказівника. Звичайно ця функція викликається після зміни режиму роботи дисплея.
1.3. Показати вказівник миші
Вхід: AX=1;
Функція $01 показує вказівник на екрані. Оскільки драйвер відслідковує переміщення миші і при погашенні вказівника, останній може з'явитися в любому місці екрану – не обов'язково там, де був погашений.
1.4. Забрати вказівник миші
Вхід: AX=2:
Функція $02 гасить вказівник миші. Цю функцію слід викликати перед кожним використанням прямого до відеопам’яті. Справа в тому, що драйвер запам’ятовує стан відеопам’яті перед виводом вказівника на екран і відновлює цей стан при зміні вказівника в нове місце. Якщо перед безпосереднім записом у відеопам’ять не погасити вказівник, драйвер виведе на екран невірний символ при зміщенні миші. Точно так ж при безпосередньому зчитуванні із відеопам'яті можна зчитувати вказівник миші замість відповідного символу.
Слід мати на увазі, що драйвер нарощує на одиницю внутрішній лічильник всякий раз, коли викликається функція $02, і зменшує цей лічильник при виклику функції $01. Вказівник з'являється тільки в тому випадку, якщо цей лічильник рівний 0, тому виклик функції $01 і $02 може не привести до бажаних результатів, якщо порушені відповідності викликів.
1.5. Отримання поточних координат миші і стан її кнопок
Вхід: AX=3.
Вихід: BX – байт стану кнопок:
Біти 0 – ліва кнопка;
1 – права кнопка;
2 – середня кнопка;
(1 відповідає натиснутій кнопці; 0 - відпущеній);
CX – горизонтальна координата миші;
DX – вертикальна координата.
Функція $03 дає інформацію про поточний стан мишки; стан кнопок вказується бітами регістра BX, в той час як в регістр CX і DX повертаються поточні координати вказівника. Координати вказівника відповідають віртуальному екрану. На практиці вони містять положення координатної точки (пікселя) вказівника в графічному режимі або помножені на 8 координати в текстовому режимі (відлік координат від 0). Таким чином, щоб перевести віртуальні координати позиція-колонка, потрібно розділити отримані значення на 8 і додати до них одиницю (текстові координати в Турбо Паскалі відраховуються від 1). Для графічного режиму такий перелік не потрібний.
1.6. Переміщення вказівника в нове положення
Вхід: AX=4;
CX, DX – потрібні віртуальні координати (X, Y) миші.
Функція $04 встановлює вказівник миші в задану точку екрана. Функція отримує віртуальні координати, тому при звертанні до неї координати текстового екрану повинні зменшуватись на одиницю і множитись на 8. Віртуальні координати потрібного положення вказівника повинні знаходитись в прямокутнику, який межується звертаннями до функцій $07 та $08.
2. Опис програми
В даному розділі розглянемо структуру модуля Mouse.pas (Додаток 1). Даний модуль написаний на мові програмування Pascal та описує такі функції і процедури:
Повертає значення True, якщо програмі доступна миша.
MousePresent: boolean;
Для провірки доступності миші функція контролює вектор переривань $33 – він не повинен бути нульовим. Потім вона звертається до функції 3 драйвера (дати статус миші) і контролює зміну регістру BX. Ці перевірки здійснюються тільки в тому випадку, якщо внутрішня змінна NButton, містить кількість кнопок миші, рівна нулю. Якщо миша оснащена двома або трьома кнопками, в цю змінну поміщається потрібне число першого ж звертання до функції InitMouse.
Функція MouseInit здійснює скидання драйвера миші та повертає кількість кнопок.
MouseInit(var nb:word):boolean;
Після виклику цієї функції вказівник гаситься і встановлюється в центр екрану, він набуває стандартної форми, границі переміщення вказівника розширюються на весь екран, для цього відображення в текстовому режимі вибирається відеосторінка 0 (основна). Якщо до цього моменту були визначені елементи вибору, вони скидаються.
Функція повертає значення True після успішного виклику та False, якщо відсутній драйвер миші або нема фізичного доступу. Виклик функції повинен бути першим перед початком роботи з мишею.
Процедура Mouseshow показує вказівник миші.
procedure Mouseshow;
Процедура Mousehide; гасить вказівник миші.
procedure Mousehide;
Драйвер миші веде підрахунок звертань до функцій. Щоб виключити неоднозначну реакцію, процедури Mouseshow та Mousehide перевіряють внутрішній флаг MouseVisible і реалізують звертання до цих функцій тільки в тому випадку, якщо це дійсно необхідно. Якщо вказівник уже зображений на екрані, ігнорується виклик Mouseshow, навпаки, якщо вказівник погашений, ігнорується виклик Mousehide.
Слід зауважити, що при роботі з стандартними процедурами модуля Crt, а також при нормальному виводі на екран процедурами Write/WriteLn Turbo Pascal організовує прямий доступ до відеопам’яті. Тому корисно використовувати Mousehide перед будь-якими змінами екрану.
Процедура mouseread повертає поточний стан миші:
procedure mouseread(var x,y,bmask:integer);
bmask – признак стану кнопок; x,y – поточні віртуальні координати. В змінній bmask процедура повертає інформацію по поточний стан кнопок миші. Для кожної кнопки в цьому слові виділений один біт (0-вий біт для лівої, 1-ий біт для правої і 2-ий біт для середньої; 0-ий біт відповідає молодшому розряду). Якщо біт має одиничне значення, кнопка натиснута, в іншому випадку – відпущена.
Процедура mousesetpos переміщує вказівник в задану точку екрану
procedure mousesetpos(x,y:word);
x,y – віртуальні координати потрібного положення вказівника.
З використанням цих підпрограм створимо програму для демонстрації роботи мишки в текстовому та графічному режимах.
Сама програма демонстрації (Додаток 2) містить такі підпрограми:
Procedure ShowCircle(X, Y, Xold, Yold, An : Integer); - зображення сектора в квадраті розміром 100х100 з верхньою координатою X,Y та кутом сектора An. Перед виводом нового положення сектора виводиться область екрану в точку Xold, Yold, що було запам’ятовано попереднім викликом функції, а також запам'ятовується область, в яку буде виводитись сектор. Дана функція застосовується в графічному режимі для демонстрації натиснення кнопок миші та переміщення об'єкту за допомогою миші.
Procedure Button(x,y,x1,y1:word; S :string); - рисування кнопки з вказаними координатами та надписом.
Procedure FrameGraph(X1,Y1,X2,Y2,cf,ct:Integer;s:string); - рисування подвійної рамки в графічному режимі з вказаними координатами, кольором рамки та тексту, а також вивід назви (заголовку) рамки.
Procedure Cursor(I1,I2:Byte);Assembler; - встановлення розміру текстового курсору, використовується для „приховання” курсору в текстовому режимі.
Procedure FrameWindow(X1,Y1,X2,Y2,cf,ct:Byte;s:string); - рисування подвійної рамки в текстовому режимі з вказаними координатами, кольором рамки та тексту, а також вивід назви (заголовку) рамки.
Procedure TextDem; - Процедура для демонстрації роботи мишки в текстовому режимі.
Procedure GraphDem; - Процедура для демонстрації роботи мишки в графічному режимі.
3. Інструкція користувачу
Після запуску програми на виконання на екрані буде зображено основне меню програми для вибору наступних дій (рис 3.1.). Щоб запустити демонстраційних можливостей створеного модуля в графічному режимі потрібно натиснути клавішу 1, для графічного режиму – 2. Щоб вийти з програми потрібно натиснути 0.
Рис 3.1.
Натиснувши 1 програму почне виконувати підпрограму TextDem – демонстрування роботи в текстовому режимі. (Рис 3.2.). На екрані зображено режим відображення – текстовий, кількість кнопок миші, координати, текстові координати миші, а також стан натиснутих клавіш. Якщо натиснути будь-яку клавішу буде відображено її стан.
Рис 3.2.
По кутах екрану зображено чотири прямокутники, якщо натиснути кнопку мишки на одному з них, то вказівник мишки переміститься в протилежний. Це демонструє можливість процедури переміщення курсору в задану точку.
Щоб вийти з текстового режиму потрібно натисну кнопку миші на надписі Вихід. Програма повернеться в головне меню. Далі виберемо графічний режим, для цього потрібно натиснути клавішу 2. Програма почне виконувати підпрограму GraphDem. (Рис 3.3). На екрані буде зображено режим роботи – графічний, кількість кнопок миші, а також поточні графічні координати. В лівому верхньому куті екрана зображений сектор, який використовується для демонстрування роботи натискування клавіш мишки. Натиснувши ліву клавішу почне збільшуватись кут сектора, праву – зменшуватись. Натиснувши обидві клавіші на секторі можна його переміщувати по екрані не відпускаючи клавіш мишки.
Рис 3.3.
Для виходу з демонстраційної підпрограми в графічному режимі потрібно натиснути кнопку Вихід.
Висновки
В курсовій роботі розглянуто основні функції для роботи з маніпулятором мишка на системному рівні. Також розроблено модуль підпрограм для роботи з даним маніпулятором, які дозволяють працювати з мишкою в середовищі Pascal. На даній мові програмування розроблено програму для демонстрування роботи мишки в текстовому та графічному режимах.
Література
Издательская группа BHV, Турбо Паскаль 7.0. 1999р.
Климова Л. М. "Практическое програмирование. Решение типовых задач" - М., 2000.
Фаронов В. В. Программирование на персональных ЭВМ в среде ТУРБО ПАСКАЛЬ. -М.,1990.
Фар онов В. В. Турбо Паскаль 7.0. Практика программирования. Учебное пособие.-М., 2000.
Додатки
Додаток 1. Модуль для роботи з мишкою
unit mouse;
interface
var MousePresent: boolean;
function MouseInit(var nb:word):boolean;
procedure Mouseshow;
procedure Mousehide;
procedure mouseread(var x,y,bmask:integer);
procedure mousesetpos(x,y:word);
implementation
uses dos;
var r:registers;
mi:pointer;
function MouseInit;
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;
mouseinit:=true
end;
end
else
begin
nb:=0;
mouseinit:=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;
begin
r.ax:=3;
intr($33,r);
x:=r.cx;
y:=r.dx;
bmask:=r.bx;
end;
procedure mousesetpos;
begin
r.ax:=4;
r.cx:=x;
r.dx:=y;
intr($33,r);
end;
begin
getintvec($33,mi);
if mi=nil then
mousepresent := False
else;
if byte(mi^)= $ce then
mousepresent :=False
else
mousepresent :=True;
end.
Додаток 2. Текст демонстраційної програми
Uses Crt, Mouse, Graph;
Label 1;
Const MDelay=10000;
Var
Size : Word;
P, P1 : Pointer;
BMask,X, Y, OldX, OldY : Integer;
Nb : word;
Gd, Gm :Integer;
S : String;
Xc, Yc, XcOld, YcOld : Integer;
A1 : Integer;
Procedure ShowCircle(X, Y, Xold, Yold, An : Integer);
Begin
PutImage(Xold, Yold, P^, NormalPut);
FreeMem(P, Size);
Size := ImageSize(X, Y, X+100, Y+100);
GetMem(P, Size);
GetImage(X, Y, X+100, Y+100, P^);
SetColor(2);
SetFillStyle(7,2);
Sector(X+50,Y+50,0,An,50,50);
End;
Procedure Button(x,y,x1,y1:word; S :string);
Begin
SetFillStyle(1,6);
Setcolor(15);
Bar(X,Y,X1,Y1);
SetColor(9);
Rectangle(X,Y,X1,Y1);
SetColor(9);
rectangle(X+7,Y+7,X1-7,Y1-7);
Line(x,y,x+7,y+7);
Line(x1,y,x1-7,y+7);
Line(x,y1,x+7,y1-7);
SetFillStyle(1,9);
FloodFill(x1-4,y1-4,9);
SetColor(6);
Rectangle(x,y,x1,y1);
Setcolor(15);
SetTextStyle(0,0,1);
OutTextXY(X+((X1-X) div 2)-(TextWidth(S) div 2),
Y+((Y1-Y) div 2)-(TextHeight(S) div 2),S);
End;
Procedure FrameGraph(X1,Y1,X2,Y2,cf,ct:Integer;s:string);
Var
I,k:Byte;
Begin
SetColor(cf);
RecTangle(X1,Y1,X2,Y2);
RecTangle(X1+3,Y1+3,X2-3,Y2-3);
SetFillStyle(0,1);
SetTextStyle(0,0,1);
Bar(X1+((X2-X1) div 2)-(TextWidth(S) div 2),Y1-(TextHeight(S) div 8),
X1+((X2-X1) div 2)+(TextWidth(S) div 2),Y1+(TextHeight(S)));
SetColor(ct);
OutTextXY(X1+((X2-X1) div 2)-(TextWidth(S) div 2),
Y1-(TextHeight(S) div 8),S);
End;
Procedure Cursor(I1,I2:Byte);Assembler;
Asm
MOV DX,3D4H
MOV AL,10
OUT DX,AL
MOV AL,I1
INC DX
OUT DX,AL
MOV AL,11
DEC DX
OUT DX,AL
MOV AL,I2
INC DX
OUT DX,AL
end;
Procedure FrameWindow(X1,Y1,X2,Y2,cf,ct:Byte;s:string);
Var
I,k:Byte;
Begin
k:=textattr;
textattr:=cf;
For I:=X1+1 To X2-1 Do
Begin
GotoXY(I,Y1);
Write('═');
GotoXY(I,Y2);
Write('═');
End;
For I:=Y1+1 To Y2-1 Do
Begin
GotoXY(X1,I);
Write('║');
GotoXY(X2,I);
Write('║');
End;
GotoXY(X1,Y1);
Write('╔');
GotoXY(X1,Y2);
Write('╚');
GotoXY(X2,Y1);
Write('╗');
GotoXY(X2,Y2);
Write('╝');
textattr:=ct;
Window(1,1,80,25);
gotoxy(x1+round(((x2-x1)/2)-(0.5*length(s))),y1);
write(s);
textattr:=k;
End;
Procedure TextDem;
Begin
TextBackGround(1);
ClrScr;
FrameWindow(1,1,80,24,15+16,14+16,' Текстовий режим ');
MouseInit(Nb);
GotoXY(30,25);TextColor(14);Write('Кiлькiсть клавiш: ');TextColor(10);Write(Nb);
FrameWindow(25,6,55,8,15+15,16+15,' Координати ');
FrameWindow(25,9,55,11,15+15,16+15,' Текстовi координати ');
FrameWindow(25,12,55,14,15+15,16+15,' Лiва клавiша ');
FrameWindow(25,15,55,17,15+15,16+15,' Права клавiша ');
FrameWindow(25,18,55,20,15+15,16+15,' Середня клавiша ');
TextColor(15);
GotoXY(34,23);
Write('<< ВИХIД >>');
FrameWindow(2,2,4,4,15+15,0,'');
FrameWindow(77,2,79,4,12+15,0,'');
FrameWindow(2,21,4,23,13+15,0,'');
FrameWindow(77,21,79,23,14+15,0,'');
TextColor(15);
GotoXY(30,7);
Write(' X= Y= ');
GotoXY(30,10);
Write(' X= Y= ');
OldX := 0;
OldY := 0;
MouseShow;
while true Do
Begin
MouseRead(X,Y,BMask);
If (X<>OldX) Or (Y<>OldY) Then
Begin
{Координати}
MouseHide;
TextColor(10);
GotoXY(37,7);
Write(X,' ');
GotoXY(45,7);
Write(Y,' ');
GotoXY(37,10);
Write((X div 8)+1,' ');
GotoXY(45,10);
Write((Y div 8)+1,' ');
OldX := X;
OldY := Y;
MouseShow;
Continue;
End;
If BMAsk=0 Then
Begin
TextColor(10);
GotoXY(27,13);
Write(' Вiдпущена ');
GotoXY(27,16);
Write(' Вiдпущена ');
GotoXY(27,19);
Write(' Вiдпущена ');
Continue;
End Else
Begin
If (X div 8 >=33) And (Y div 8 = 22) And (X div 8<=43) Then Exit;
If (X div 8 = 3-1) And (Y div 8 = 3-1) Then
Begin
MouseSetPos(78*8-8,22*8-8);
Delay(MDelay);
Continue;
End;
If (X div 8 = 78-1) And (Y div 8 = 22-1) Then
Begin
MouseSetPos(3*8-8,3*8-8);
Delay(MDelay);
Continue;
End;
If (X div 8 = 78-1) And (Y div 8 = 3-1) Then
Begin
MouseSetPos(3*8-8,22*8-8);
Delay(MDelay);
Continue;
End;
If (X div 8 = 3-1) And (Y div 8 = 22-1) Then
Begin
MouseSetPos(78*8-8,3*8-8);
Delay(MDelay);
Continue;
End;
End;
{Лiва}
If BMask=1 Then
Begin
GotoXY(27,13);
Write(' Натиснута ');
Continue;
End;
{Права}
If BMask=2 Then
Begin
GotoXY(27,16);
Write(' Натиснута ');
Continue;
End;
{Середня}
If BMask=3 Then
Begin
GotoXY(27,19);
Write(' Натиснута ');
Continue;
End;
End;
End;
Procedure GraphDem;
Begin
Gd := Detect;
InitGraph(Gd, Gm, '');
MouseInit(Nb);
if GraphResult <> grOk then
Begin
WriteLn('Помилка iнiцiалiзацii графчного режиму !!!');
ReadKey;
Exit;
End;
SetBKColor(1);
ClearDevice;
FrameGraph(0,10,GetMaxX-1,GetMaxY-20,15,14,' Графiчний режим ');
SetColor(14);
MoveTo(240,465);
OutText('Кiлькiсть клавiш: ');
Str(Nb,S);
SetColor(10);
OutText(S);
FrameGraph(220,100,420,150,14,15,' Координати ');
SetColor(15);
OutTextXY(270,120,'X= Y= ');
Button(240,420,400,450,'Вихiд');
Size := ImageSize(50, 50, 150, 150);
GetMem(P, Size);
GetImage(50, 50, 150, 150, P^);
SetColor(2);
SetFillStyle(1,2);
Sector(100,100,0,360,50,50);
Xc := 50; Yc := 50;
XcOld := 50; YcOld := 50;
A1 := 360;
MouseShow;
while true Do
Begin
MouseRead(X,Y,BMask);
If BMAsk=3 Then
Begin
If ((X>=Xc) And (Y>=Yc) And (X<=Xc+100) And (Y<=Yc+100))
And ((X<>OldX) Or (Y<>OldY)) Then
Begin
MouseHide;
Xc := Xc + (X-OldX);
Yc := Yc + (Y-OldY);
If (Xc < 5) Or (Xc+100>635) Then Xc := Xc - (X-OldX);
If (Yc < 5) Or (Yc+100>475) Then Yc := Yc - (Y-OldY);
ShowCircle(Xc,Yc,XcOld,YcOld,A1);
XcOld := Xc;
YcOld := Yc;
End;
End Else
If (BMask=1) And (A1>90) Then
Begin
If (X>=240) And (Y>=420) And (X<=400) And (Y<=450) Then Exit;
MouseHide;
Dec(A1,2);
ShowCircle(Xc,Yc,XcOld,YcOld,A1);
End Else
If (BMask=2) And (A1<360) Then
Begin
MouseHide;
Inc(A1,2);
ShowCircle(Xc,Yc,XcOld,YcOld,A1);
End Else MouseShow;
If (X<>OldX) Or (Y<>OldY) Then
Begin
{Координати}
MouseHide;
Str(X,S);
SetColor(10);
SetFillStyle(0,1);
Bar(290,110,330,130);
OutTextXY(300,120,S);
Str(Y,S);
SetColor(10);
SetFillStyle(0,1);
Bar(350,110,390,130);
OutTextXY(360,120,S);
OldX := X;
OldY := Y;
MouseShow;
Continue;
End;
End;
CloseGraph;
FreeMem(P,Size);
End;
Var Ch : Char;
Begin
1:
TextMode(CO80);
TextBackGround(0);
ClrScr;
Cursor(1,0);
If Not MouseInit(Nb) Then
Begin
FrameWindow(20,10,60,12,4,4,'Помилка');
GotoXY(30,11);TextColor(15);
Write('Мишка не знайдена !!!');
ReadKey;
Exit;
End;
FrameWindow(30,10,50,14,15,14,'');
TextColor(10);
GotoXY(31,11);Write('1 - Текстовий режим');
GotoXY(31,12);Write('2 - Графiчний режим');
GotoXY(31,13);Write('0 - Вихiд');
While True Do
Begin
Ch := ReadKey;
If Ch = #48 Then Break;
If Ch = #49 Then
Begin
TextDem;
Goto 1;
End;
If Ch = #50 Then
Begin
GraphDem;
Goto 1;
End;
End;
End.