Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сис прогр курсовая / Metod_k_kurs_rabote.doc
Скачиваний:
8
Добавлен:
07.02.2016
Размер:
282.62 Кб
Скачать

Примітка. В дужках подано довжини нот. Додаток б

РОБОТА З МОНІПУЛЯТОРОМ МИШІ

Для роботи з маніпулятором миші використовується вектор переривання INT 33h. Ця програма виконує всі операції, що пов’язані з обслуговуванням миші:

  • скидання параметрів миші та встановлення драйверу в вихідний стан;

  • ввімкнення та вимкнення курсору в зазначеному місці екрану;

  • визначення поточних координат курсору й поточного стану клавіш;

  • визначення координат курсору й стану клавіш в момент натискання на клавішу й в момент відпускання клавіші;

  • визначення області на екрані, в межах якої курсор може пересуватися;

  • визначення області на екрані, в межах якої курсор не буде видно;

  • зазначення форми графічного й текстового курсорів;

  • визначення величини пересування миші в сотих долях дюйма;

  • підключення до драйверу процедури, визначеної в програмі, що отримує керування при натисканні на задану клавішу або при пересуванні миші;

  • збереження та відновлення стану драйверу;

  • керування швидкістю руху курсору;

  • зазначення або визначення сторінки відеопам’яті, що використовується;

  • керування драйвером миші.

Б.1 Ініціалізація миші

Для ініціалізації миші використовується функція з кодом 00h. Ця функція виконує апаратне скидання параметрів миші й програмне встановлення драйверу миші в початковий стан. За допомогою функції 21h можна виконати встановлення драйверу в початковий стан, не виконуючи апаратного скидання параметрів миші.

Регістри на вході: АX=0000h

Регістри на виході: AX = стан миші

BX = кількість клавіш у миші.

Якщо на виході з переривання регістр AX містить значення 0000h, це свідчить проте, що драйвер миші відсутній. Якщо значення змісту цього регістру рівне 0FFFFh, драйвер миші є й можна використовувати інші функції для роботи з мишею.

В регістр ВХ повертається кількість клавіш миші

Таблиця Б.1

Вміст ВХ

Кількість клавіш

0000h

Більш або менш ніж дві

0001h

Дві клавіші

0002h

Миша системи Mouse Systems, має три клавіші

Б.2 Вмикання(вимикання) курсору миші

Для вмикання курсору миші використовується функція 01h. Ця функція дозволяє вмикати або вимикати курсор миші:

Регістри на вході: АХ = 0001h

Регістри на виході: Регістри не використовуються.

Для керування видимістю курсору драйвер використовує внутрішній лічильник. Цей лічильник можна збільшувати, викликаючи функцію 01h переривання 33h, або зменшувати за допомогою функції 02h.

Після ініціалізації драйверу функцією 00h лічильник встановлюється рівним –1. Після першого виклику функції 01h лічильник стає рівним нулю. При цьому курсор миші стає видимим, його можна пересувати по екрану.

Якщо лічильник рівний нулю, то наступний виклик функції 01h ігноруються драйвером. Для того, щоб згасити курсор, використовується функція 02h, яка при виклику зменшує кожного разу зміст лічильника на одиницю.

Функція 01h скидає область, в якій курсор не відображається(Якщо така область була раніш встановлена функцією 10h).

Для вимикання курсору миші використовується функція 02h. Функція зменшує на одиницю лічильник видимості курсору. Якщо вміст лічильника стає рівним –1, зображення курсору зникає з екрану.

Регістри на вході: АХ = 0002h

Регістри на виході: Регістри не використовуються.

Якщо програма застосовує для виводу до екрану метод прямого запису до відеопам’яті, перед поновленням змісту екрану необхідно згасити курсор, а після завершення оновлення – відобразити його знову.

Це пов’язане з тим, що драйвер миші запам’ятовує старе значення атрибуту символу, на який посилався курсор до поновлення змісту відеопам’яті. Якщо змінити атрибут, записавши нове значення безпосередньо до екранної пам’яті, то якщо встановити курсор миші на інший символ, зображення старого символу буде зіпсовано – з’явиться прямокутник(наче б то ще одне зображення курсору миші).

Б.3 Визначення положення курсору

Для визначення положення курсору використовується функція 03h. Ця функція повертає поточні координати курсору миші й стан клавіш.

Регістри на вході: АХ = 0003h

Регістри на виході: ВХ = стан клавіш миші;

СХ = X координата курсору;

DX = Y координата курсору;

В залежності від того, була чи ні натиснута будь-яка клавіша миші в момент виклику функції, в регістрі ВХ можуть бути встановлені наступні ознаки:

Таблиця Б.2

Біт регістру ВХ

Клавіша, котра була натиснута

0

Ліва

1

Права

2

Середня

Для графічних режимів координати розташовуються в різних діапазонах:

Таблиця Б.3

Розмір екрану в пікселях

Номер режиму

Діапазон координат за віссю Х

Діапазон координат за віссю Y

320x200

4, 5

0-638

0-199

640x200

6

0-639

0-199

320x200

0Dh

0-638

0-199

640x200

0Eh

0-639

0-199

640x250

0Fh

0-639

0-199

Програми, що працюють у текстовому режимі, повинні розділяти отримані координати на 8(як координату Х, так і координату Y).

Використання функції 03h не найкращий спосіб роботи з мишею. Програма повинна постійно слідкувати за координатами курсору чи за станом клавіш. Це може призвести до непродуктивних витрат процесорного часу на опитування стану.

Далі розглянуто інші способи визначення стану миші.

Б.4 Встановлення курсору в задану позицію

Зазвичай курсор миші встановлює не програма, а користувач. Однак за допомогою функції 04h програма також може встановити курсор в задану позицію.

Регістри на вході: АХ = 0004h

СХ = нова Х координата курсору;

DX = нова Y координата курсору

Регістри на виході: Регістри не використовуються

Для текстового режиму номери рядку та стовпцю, які встановлюються, повинні бути помножені на 8.

У тому випадку, коли програма намагається встановити курсор в область, де курсор невидимий(ця область задається функцією 10h), курсор при цьому щезне з екрану, що не завжди бажано.

Якщо область для пересування курсору була обмежена за допомогою функцій 07h та 08h, то курсор буде вести себе наступним чином. При спробі встановити курсор за лінію обмеження його буде встановлено в точку, яка знаходиться в середині межі на мінімальній відстані від точки, що задано при виклику функції.

Б.5 Визначення курсору при натисканні клавіші

Регістри на вході: АХ = 0005h

BX = клавіша, при натисканні якої запам’ятовується стан миші:

0 – ліва;

1 – права;

2 – середня.

Регістри на виході : АХ = стан клавіш миші;

ВХ = кількість натискань на задану клавішу. Це значення рівне нулю після виклику функції;

СХ = Х координата курсору;

DX = Y координата курсору.

В залежності від того, була натиснута чи ні будь-яка клавіша миші в момент виклику функції, в регістрі АХ можуть бути встановлені наступні ознаки:

Таблиця Б.4

Біт регістру АХ

Клавіша, яку було натиснуто

0

Ліва

1

Права

2

Середня

На відміну від функції 03h ця функція повертає програмі не поточний стан миші, а той що було збережено в момент останнього натискання на клавішу, раніш зазначену при виклику функції. Вона також повертає кількість натискань на задану клавішу, яке можна використовувати для виявлення подвійних клацань.

Б.6 Визначення положення курсору при відпусканні клавіші

Функція 06h повертає програмі стан миші, що було збережено в момент відпускання клавіші, яка була раніш зазначена при виклику функції.

Регістри на вході: АХ = 0006h

ВХ = клавіша, при відпусканні якої запам’ятовується стан миші:

0 – ліва;

1 – права;

2 – середня;

Регістри на виході: АХ = стан клавіш миші;

ВХ = кількість натискань на задану клавішу. Це значення рівне нулю після виклику функції;

СХ = Х координата курсору;

DX = Y координата курсору;

Формат регістру АХ, що зазначає стан клавіш миші, такий самий як і для функції 05h.

Б.7 Встановлення діапазону руху курсору по горизонталі(вертикалі)

Функція 07h дозволяє обмежити діапазон пересування курсору миші у горизонтальній площині.

Регістри на вході: АХ = 0007h

СХ = мінімальна координата Х;

DX = максимальна координата Х.

Регістри на виході: Регістри не використовуються.

Функція 08h дозволяє обмежити діапазон пересування курсору миші у вертикальній площині.

Регістри на вході: АХ = 0008h

СХ = мінімальна координата Y;

DX = максимальна координата Y.

Регістри на виході: Регістри не використовуються.

Б.8 Встановлення форми курсору в графічному режимі

За допомогою функції 09h програма, що працює в графічному режимі, може змінити форму курсору миші та положення точки в середині зображення курсору, координати якої використовуються в якості координат курсору іншими функціями.

Регістри на вході: АХ = 0009h

ВХ = номер позиції точки-покажчика графічного курсору (від -16 до 16);

DX = номер рядку точки-покажчика (від -16 до 16)

ES:DX = покажчик на растрове зображення курсору

Регістри на виході: Регістри не використовуються

Регістри ES:DX посилаються на область пам’яті розміром 64 байти. Ця область складається з двох масивів довжиною по 32 байти. Перший масив – логічна маска розміром 16х16 біт, яка накладається на ділянку відеопам’яті з використанням логічної операції "І". Другий масив – також маска розміром 16х16 біт, але вона накладається з використанням логічної операції "Виключного АБО", інвертуючи окремі точки зображення.

Номери позиції й рядку точки-покажчика, які задаються за замовчуванням, рівні нулю(ВХ = СХ = 0). Це відповідає верхній лівій точці в зображенні курсору. Значення ВХ = СХ = 15 відповідають ніжній правій точці.

Б.9 Встановлення форми курсору в текстовому режимі

За допомогою функції 0Ah програма може змінити форму курсору миші в текстовому режимі.

Регістри на вході: AX = 000Ah

BX = тип курсору:

0 – задається програмно;

1 – задається апаратно;

СХ = маска екрану (для ВХ = 0) або кінцевий рядок курсору (для ВХ = 1)

DX = маска курсору (для ВХ = 0) або кінцевий рядок курсору (для ВХ = 1)

Регістри на виході: Регістри не використовуються

В залежності від змісту регістру ВХ драйвер миші використовує курсор, зазначений апаратними засобами, або курсор, що зазначено програмно. За замовчуванням використовується програмний курсор, який відображається у вигляді символу з інвертованим значенням атрибуту. Курсор, сформований апаратними засобами, має вигляд аналогічний звичайному текстовому курсору, його форма – прямокутник. Розмір прямокутника можні задавати за допомогою регістрів СХ та DX.

Для курсору, що зазначено програмно, спочатку виконується операція логічного "І" над вмістом відеопам’яті в тому місці, куди посилається курсор, та маскою екрану. Потім виконується операція "Виключного АБО" з маскою курсору.

Молодший байт масок, відповідає коду ASCII символу, старший – це байт атрибуту символу.

Значення, що використовується за замовчуванням, – ВХ = 7700h, CX = FFFFh.

Якщо треба змінити колір курсору, не змінюючи його форму, треба задати СХ = 00FFh, ВХ = хх00h, де хх зазначає колір.

Програма sys_m1.cpp. Програма демонструє зміну форми курсору в графічному режимі. На запит програми «Enter new videomode:» введіть цифру 6. На екрані з’явиться курсор миші:

#include<dos.h>

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

union REGS reg;

void ms_gform(int xt, int yt, char _far *form);

unsigned char form[64]=

{

//Масив маски "І"

255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255, 255, 255, 255, 255,

255, 255, 255, 255, 255, 255,

//Масив маски "Виключного АБО"

/*Тут по черзі задаються значення рядків двох розташований поруч вертикальних матриць розміром 16х32, починаючи з правої матриці. */

127, 254, 127, 254, 127, 254, 127, 254, 127, 254,

127, 254, 127, 254, 0, 0,

0, 0, 127, 254, 127, 254, 127, 254, 127, 254, 127, 254,

127, 254, 127, 254

};

int main(void)

{

unsigned old_videomode, new_videomode;

char buf[20], *bufptr;

//Визначити відеорежим

reg.x.ax=0x0f00;

int86(0x10, &reg, &reg);

old_videomode=reg.h.al;

//Встановити новий відеорежим

buf[0]=10;

printf("Enter new videomode :");

bufptr=cgets(buf);

new_videomode=atoi(bufptr);

reg.h.ah=0;

reg.h.al=new_videomode;

int86(0x10, &reg, &reg);

//Ініціалізація миші

reg.x.ax=0;

int86(0x33, &reg, &reg);

if(reg.x.bx==0)

{

printf("Mouse not found\n");

return -1;

}

//Задати нову форму курсору миші

ms_gform(0,0, form);

reg.x.ax=1;

int86(0x33, &reg, &reg);

getch();

reg.h.ah=0;

reg.h.al=old_videomode;

int86(0x10, &reg, &reg);

return 0;

}

void ms_gform(int xt, int yt, char _far *form)

{

struct SREGS segregs;

reg.x.ax=9;

reg.x.bx=xt;

reg.x.cx=yt;

reg.x.dx=FP_OFF(form);

segregs.es=FP_SEG(form);

int86x(0x33, &reg, &reg, &segregs);

}

Наприклад, для букви «К» бітова маска в двійковому й десятковому вигляді:

11111111 11111111 255 255

11111111 11111111 255 255

11110011 11100111 243 231

11110011 11001111 243 207

11110011 10011111 243 159

11110011 00111111 243 63

11110000 00111111 240 63

11110011 00111111 243 63

11110011 10011111 243 159

11110011 11001111 243 207

11110011 11100111 243 231

11110011 11110011 243 243

11110011 11111001 243 249

11110011 11111100 243 252

11111111 11111111 255 255

11111111 11111111 255 255

Тоді в програму треба ввести масив маски "Виключного АБО":

255, 255, 255, 255, 231, 243, 207, 243, 159,243, 63, 243, 63, 240, 63, 243, 159, 243, 207, 243, 231, 243, 243, 243, 249, 243, 252, 243, 255, 255, 255, 255

Програма sys_m2.cpp створює курсор у вигляді направленої вверх стрілки на синьому фоні. Виконайте програму в повно екранному режимі.

#include<dos.h>

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

union REGS reg;

void ms_tform(int type, int mask1, int mask2);

int main(void)

{

//Ініціалізація миші

reg.x.ax=0;

int86(0x33, &reg, &reg);

if(reg.x.bx==0)

{

printf("Mouse not found\n");

return -1;

}

//Задати нову форму для курсору миші

ms_tform(0,0, 0x1418); // де 14 – атрибути(фон та колір), а 18 – ASCII код в 16-му коді.

//Ввімкнути курсор

reg.x.ax=1;

int86(0x33, &reg, &reg);

getch();

return 0;

}

void ms_tform(int type, int mask1, int mask2)

{

reg.x.ax=0xA;

reg.x.bx=type;

reg.x.cx=mask1;

reg.x.dx=mask2;

int86(0x33, &reg, &reg);

}

Соседние файлы в папке Сис прогр курсовая