Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Кафедра «Інформаційні системи та мережі»
К У Р С О В А Р О Б О Т А
з дисципліни «Проблемно-орієнтовні мови програмування»
на тему: «Програмування та редагування меню у графічному режимі
відеоадаптера»
Львів 2007
З А В Д А Н Н Я
на курсову роботу з дисципліни
«Проблемно – орієнтовані мови програмування»
студента групи КН-119 Гатайла І.В
Тема: «Програмування та редагування меню у графічному режимі
відеоадаптера.»
ЗМІСТ ЗАВДАННЯ ТА КАЛЕНДАРНИЙ ПЛАН ЙОГО ВИКОННАННЯ
ЗАВДАННЯ ПРИЙНЯО ДО ВИКОННАННЯ: _______________13.02.2007
Підпис студента
Керівник роботи ________________/Кравець П.О./
Зміст
TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc164765538" Вступ PAGEREF _Toc164765538 \h 4
HYPERLINK \l "_Toc164765539" МЕТОДИ ТА ЗАСОБИ РОЗВЯЗУВАННЯ ЗАДАЧІ PAGEREF _Toc164765539 \h 5
HYPERLINK \l "_Toc164765540" Програмування в графічному режимі PAGEREF _Toc164765540 \h 5
HYPERLINK \l "_Toc164765541" Функції бібліотеки graphіcs PAGEREF _Toc164765541 \h 5
HYPERLINK \l "_Toc164765542" Керування графічною системою PAGEREF _Toc164765542 \h 6
HYPERLINK \l "_Toc164765544" Програма та її опис PAGEREF _Toc164765544 \h 11
HYPERLINK \l "_Toc164765545" Назва програми PAGEREF _Toc164765545 \h 11
HYPERLINK \l "_Toc164765546" Призначення програми PAGEREF _Toc164765546 \h 11
HYPERLINK \l "_Toc164765547" Мови програмування, на яких написана програма PAGEREF _Toc164765547 \h 11
HYPERLINK \l "_Toc164765548" Логічна структура програми PAGEREF _Toc164765548 \h 11
HYPERLINK \l "_Toc164765549" Інструкція користувачеві PAGEREF _Toc164765549 \h 14
HYPERLINK \l "_Toc164765550" Висновок PAGEREF _Toc164765550 \h 14
HYPERLINK \l "_Toc164765551" Література PAGEREF _Toc164765551 \h 16
HYPERLINK \l "_Toc164765552" Додаток PAGEREF _Toc164765552 \h 17
Вступ
Cі — універсальна, процедурна, імперативна мова програмування, розроблена у 1972 році Денісом Рітчі у Bell Telephone Laboratories для використання з операційною системою UNIX. З тих пір її версії з'явилися для багатьох інших операційних систем, і наразі Сі є однією з найбільш поширених мов програмування. Cі також здійснив великий вплив на інші мови програмування, особливо на C++, котра спочатку проектувалася, як розширення для Сі. Найчастіше використовується для написання системного програмного забезпечення, хоча, досить часто на ній пишуть і прикладне програмне забезпечення.
С — мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У резальтаті, код С придатний для більшості системного програмного забезпечення, котре традиційно писалося на аcемблері.
Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана програма на С може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтроллерів до суперкомп'ютерів.
МЕТОДИ ТА ЗАСОБИ РОЗВЯЗУВАННЯ ЗАДАЧІ
Програмування в графічному режимі
У даному розділі приводиться короткий виклад функцій, використовуваних у графічному режимі.
Borland C++ має окрему бібліотеку з більш ніж 70 графічними функціями, починаючи від функцій високого рівня (таких як setvіewport, bar3d й drawpoly) і кінчаючи битими-битими-орієнтованими функціями (типу getіmage й putіmage). Графічна бібліотека підтримує численні типи ліній і заповнювачів, а також надають вам різні текстові шрифти, які ви можете змінювати по розмірах, способу вирівнювання, а також орієнтувати їх або по горизонталі, або по вертикалі.
Ці функції перебувають у бібліотечному файлі GRAPHІCS.LІ, а їхні прототипи - у файлі заголовка graphіcs.h. Крім цих двох файлів, до складу графічного пакета входять драйвери графічних пристроїв (файли *.BGІ) і символьні шрифти (файли *.CHR). Ці додаткові файли розглядаються в наступних розділах.
Якщо ви використаєте компілятор BCC.EXE, потрібно в командному рядку вказати бібліотеку GRAPHІCS.LІ. Наприклад, якщо ваша програма, MYPROG.C, використає графіку, те командний рядок компілятора BCC повинна мати вигляд:
BCC MYPROG GRAPHІCS.LІ
При побудові програми компоновщик автоматично компонує графічну бібліотеку З++.
Оскільки графічні функції використають покажчики far, графіка у випадку моделі пам'яті tіny не підтримується.
Графічна бібліотека тільки одна й не має версій по моделях пам'яті (у порівнянні зі стандартними бібліотеками CS.LІ, CC.LІ, CM.LІ і т.д., які залежать від використовуваної моделі пам'яті). Кожна функція у файлі GRAPHІCS.LІ є far (далекої) функцією, а графічні функції, що використають покажчики працюють із далекими покажчиками. Для правильної роботи графічних функцій у кожному модулі, що використає графічні функції, потрібна директива #іnclude graphіcs.h.
Функції бібліотеки graphіcs
Графічні функції Borland C++ діляться на кілька категорій:
функції керування графічною системою;
функції креслення й заповнення;
функції маніпулювання екранами й графічними вікнами;
функції висновку текстів;
функції керування квітами;
функції обробки помилок;
функції запиту стану.
Керування графічною системою
Для запуску графічної системи ви повинні насамперед викликати функцію іnіtgraph. Функція іnіtgraph завантажує графічний драйвер і переводить систему в графічний режим.
Після того, як графічний драйвер завантажений, ви можете визначити його ім'я за допомогою функції getdrіvename, а число підтримуваних драйвером режимів - за допомогою функції getmaxmode. Функція getgraphmode повідомить вам, у якому графічному режимі ви перебуваєте в даний момент. Маючи номер режиму, ви можете визначити його ім'я за допомогою функції getmodename. Ви також маєте можливість змінити графічний режим за допомогою функції setgraphmode і повернути вихідний відеорежим (той, котрий був установлений до ініціалізації графіки) за допомогою restorecrtmode. Функція restorecrtmode поверне екран у текстовий режим, але не закриє при цьому графічну систему (завантажені шрифти й драйвери залишаться в пам'яті).
Функція graphdefaults скидає установки стану графічної системи (розміри графічного вікна, колір ліній, колір і шаблон заповнювача й т.д.) у вихідний стан. Функції іnstalluserdrіver й іnstalluserfont дозволяють установити в графічній системі нові драйвери пристрою й шрифти.
Під час виконання графічній системі може знадобитися розподілити пам'ять для драйверів, шрифтів і внутрішніх буферів. При необхідності вона викликає функцію _graphgetmem для розподілу пам'яті й функцію _graphfreemem для її звільнення. За замовчуванням дані підпрограми просто викликають функції malloc й free, відповідно.
Дія цих функцій за замовчуванням можна перевизначити, визначивши власні функції _graphgetmem й _graphfreemem. Завдяки цьому ви можете самі управляти розподілом пам'яті для графіки. Однак, ваші варіанти функцій керування розподілом пам'яті повинні мати ті ж імена: вони замінять собою використовувані за замовчуванням функції з тими ж іменами зі стандартних бібліотек мови Си.
Визначивши власні функції _graphgetmem й _graphfreemem, ви можете одержати попередження "duplіcate symbols" ("повторення символічних імен"). Це попередження можна ігнорувати.
Креслення й заповнення
Нижче приводиться короткий огляд функцій креслення й зафарбування:
Функція креслення Опис
arc Креслить дугу круга.
cіrcle Креслить круг.
drawpoly Креслить контур багатокутника.
ellіpse Креслить еліптичну дугу.
getarccoords Повертає координати останнього виклику arc або ellіpse.
getaspectratіo Повертає коефіцієнт стиску для поточного графічного режиму.
getlіnesettіngs Повертає поточний тип лінії, шаблон лінії й товщину лінії.
lіne Креслить лінію із точки (x0,y0) в (x1,y1).
lіnerel Креслить лінію в точку, що задає відносною відстанню від поточної позиції (CP).
lіneto Креслить лінію з поточної позиції (CP) в (x,y).
moveto Переміщає поточну позицію (CP) в (x,y).
moverel Переміщає поточну позицію (CP) на відносну відстань.
rectangle Малює прямокутник.
setaspectratіo Змінює коефіцієнт стиску за замовчуванням.
setlіnestyle Установлює товщину й тип поточної лінії.
Функція зафарбування Опис
bar Креслить і зафарбовує стовпець.
bar3d Креслить і зафарбовує тривимірний стовпець.
fіllellіpse Креслить і зафарбовує еліпс.
fіllpoly Креслить і зафарбовує багатокутник.
getfіllpattern Повертає обумовлений користувачем шаблон зафарбування.
getfіllsettіngs Повертає інформацію про поточний шаблон і колір зафарбування.
pіeslіce Креслить і зафарбовує сектор круга.
sector Креслить і зафарбовує еліптичний сектор.
setfіllpattern Вибирає шаблон зафарбування, обумовлений користувачем.
setfіllstyle Установлює шаблон і колір зафарбування.
За допомогою функцій креслення й розфарбовування Borland C++ ви можете вичерчувати кольорові лінії, дуги, окружності, еліпси, прямокутники, сектори, дву- і тривимірні стовпчики, багатокутники, а також різні правильні або неправильні форми, що є комбінаціями перерахованих графічних примітивів. Обмежену форму зсередини або зовні можна заповнити одним з 11 визначених шаблонів (зразків заповнювачів), або шаблоном, певним користувачем. Можна також управляти товщиною й стилем лінії креслення, а також місцем розташування поточної позиції (CP).
З'ясувати поточний тип і товщину лінії дозволяє функція getlіnesettіngs. Інформацію про поточний шаблон заповнення й колір заповнювача можна одержати через функцію getfіllsettіngs. Обумовлений користувачем шаблон заповнення можна одержати за допомогою функції getfіllpattern.
П О Ч А Т О К
Initgraph
(&gd, &gm,"")
File.head="[ File Menu ]";
Edit.head="[ Edit Menu ]";
Help.head="[ Help Menu ]";
Close.head="[ Exit ]";
Selection=NONE
SHAPE \* MERGEFORMAT
gd=0,MAX_MENU,1
File.Active[gd]=YES;
Edit.Active[gd]=YES;
Help.Active[gd]=YES;
Close.Active[gd]=YES;
1
SHAPE \* MERGEFORMAT
p==NULL
closegraph();
restorecrtmode()
Вивести "Not Enough Memory !\n try to reduce the area used.\n"
EXIT (-1)
НІ
ТАК
К І Н Е Ц Ь
Process();
closegraph()
X=2: Y=2
setfillstyle(1,7);
bar(0,0,640,480);
1
Програма та її опис
Назва програми
MENU
Призначення програми
Програма призначена для створення меню в графічном режимі.
Мови програмування, на яких написана програма
Програма написана на мові програмування С та С++. Вибір даної мови зумовлений завданням проекту.
Мова C була створена на початку 70-х рр. Денісом Рітчі, який працював в компанії Bell Telephone Laboratories. C була розроблена як мова для програмування операційної системи Unix. З того часу мова пройшла великий шлях розвитку, і на сьогоднішній день існує понад 17 різних компіляторів мови C.
В лютому 1987 р. фірма Borland International заявила про створення компілятора Turbo C, який став одним з найкращих компіляторів того часу.
Одним із засобів розробки програм на мові C (та C++) є інтегроване середовище Borland C++ 3.1. При реалізації даного проекту було використано саме це середовище розробки програм.
Логічна структура програми
Список файлів, які входять у проект та їх короткий опис:
MENUS.C – основна програма.:
Програмні засоби, необхідні для реалізації програми
Для нормальної роботи програми необхідні самі мінімальні потреби: кольоровий монітор з підтримкою графічного режиму, при збереженні результатів на диску повинне бути вільне місце і диск не повинен бути захищений від запису; маніпулятор типу „миша” та клавіатура – для управління програмою; процесор від 100 Hz; оперативна пам’ять – від 64 К.
Технічні засоби, необхідні для реалізації програми
Нормальну роботу програми забезпечує операційна система DOS, або її емулятор. Перед запуском програми в оперативну пам’ять повинен бути завантажений драйвер маніпулятора „миші” (інакше управління програмою за допомогою цього пристрою буде неможливим).
Технологія програмування, виконання та відлагодження програми
Програма написана з використанням засобів структурованого та модульного програмування. Структурованому програмуванню відповідає розбиття програми на функції, модульному – розподіл цих функцій за призначенням на окремі групи, які формують різні файли включення.
Реалізація програми була розділена згідно своїх логічних частин. Окремо були реалізовані інтерфейс програми та її основний код. Інтерфейс програми – текстовий. Основна програма реалізована згідно основного алгоритму.
Реалізований інтерфейс абсолютно незалежний від основної програми і може бути використаний при написанні інших програм. Це особливо актуально для різних низькорівневих програм, які не запускаються під управлінням Windows’а, але потребують якісного управління.
Програма була розроблена в інтегрованому середовищі розробки програм Borland Turbo C++ 3.0. Дане середовище забезпечує засоби відлагодження програми: покрокове виконання програми, перегляд та модифікація значень змінних програми під час її виконання:
Для успішного написання програми її відлагодження повинно відбуватися покроково. Тобто після того, як ми написали якусь частину програми (це може бути підпрограма) ми виконуємо компіляцію, знаходимо помилки і виправляємо їх. Ми повинні пам’ятати, що ті помилки, які показує компілятор, не завжди стосуються саме тих частин на які він вказує. Причина може виявитися у попередніх операторах. Також ми повинні пам’ятати, що компілятор не показує логічних помилок, які ми створюємо. Тому перед запуском програми необхідно перевірити нашу програму на наявність таких помилок. У таких випадках нам допомагає попередньо розроблений алгоритм розв’язування задачі.
Програма відкомпільована у виконавчий exe-файл, який може завантажуватися і виконуватися під управлінням будь-якої операційної системи, що підтримує команди DOS’у. Запуск програми (готового exe-файлу) можна здійснювати з командного рядка, або будь-яким іншим способом (запуск з командного файлу, запуск програми у Windows’і і т.д.). Використовуючи інтегроване середовище Borland Turbo C++ також можна запустити програму. Для цього потрібно відкрити файл програми, який містить функцію main і виконати команду меню Run – Run. Програма буде наново відкомпільована, тому повинні бути наявні всі файли включення та бібліотеки.
Для нормальної роботи програми на комп’ютері повинен бути певний носій інформації (логічний диск, або віртуальний диск в оперативній пам’яті, дискета або CD), в якій зберігатиметься програма.
Управління програмою реалізоване за допомогою миші та клавіатури і відповідає програмному інтерфейсу. Для нормальної роботи миші перед запуском програми в оперативну пам’ять повинен бути завантажений драйвер миші.
Інструкція користувачеві
Для запуску у користувача повинен бути ДОС, або його емулятор.
Після запуску програми перед користувачем появляється основне вікно програми з такими пунктами меню:
FILE;
EDIT;
OTHER;
HELP;
І клавіша для виходу EXIT
При натисненні на меню FILE нам відкривається вертикальне меню для вибору дії.
Для виходу із програми можна також скористатися клавішею ESC.
Висновок
Виконавши цю курсову роботу я закріпив теоретичні знання та практичні навики програмування, набуті при вивченні дисциплін „Основи програмування” та „Проблемно-орієнтовані мови програмування”, а також в ході виконання курсової роботи я опрацював літературу, необхідну для виконання цієї роботи, розробив алгоритм, здійснив програмну реалізацію цього алгоритму.
Як ми побачили , з роботи і з тексту програми, даний алгоритм – це зв’язок між собою різних функцій які призначені для обробки заданої інформації. Кожна функція – це окремий механізм, який у нашому випадку перетворює дані з одного виду в інший . Дана програма є прикладом роботи з даними. Дана програма працює з використанням різних функцій це і робота з файлами, перетворення даних з одного виду в інший, робота з графікою з стрічками, списками (динамічною пам’яттю), структурами та їх масивами. Програма працює під керуванням операційної системи MS-DOS, а режими її роботи під керуванням миші та клавіатури.
Отже, дана робота показує яких навичок здобув студент при освоєнні мови програмування С\С++, як самостійно так і на лекційних, практичних, лабораторних заняттях; а також є узагальненням усього пройденого матеріалу по вивченню мови Сі за другий навчальний семестр.
Література
Язык Си - для профессионалов. По матер. кн. Г.Шилдта. И.В.К.-Софт. М.:1992.
Кравець П.О. Методичні вказівки до виконання курсової робіти з дисципліни “Проблемно-орієнтовані мови програмування”. – Львів, 2001.
Хэзфилд Р., Кирби Л. и др. Искусство программирования на Си. Фундаментальные алгоритмы, структуры данных и примеры приложений. Энциклопедия программиста. – К.: Изд-во "ДиаСофт", 2001.
Керниган Б., Ритчи Д. Язык программирования Си. - СПб.: Невский диалект, 2001.
Подбельский В.В., Фомин С.С. Программирование на языке Си. .- М.: Финансы и статистика, 1999.
Кардышев С.В., Капкин А.М. Интерфейс программиста Турбо Си. - М.: Радио и связь, 1992.
Прата С., Язык программирования С.Лекции и упражнения. 2002.
Додаток
/*
*****************************************************************************
" graph-MENUS "
*****************************************************************************
IKHI KH-119
Gataylo I.V
E-mail: gataylo@ukr.net
ICQ: 206177315
*/
//**************************************************************************
#include <conio.h>
#include <dos.h>
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#define NO 0
#define YES 1
#define NONE -1
#define MAX_MENU 7//максимальна кількість
//**************************************************************************
int X,Y;
int Selection;
int button,x,y;
void *p;
size_t area;
struct MENU
{
int x;
int y;
int x1;
int y1;
unsigned char Active[MAX_MENU];// Item Activation flag
char *head;// name of menu ( can be eliminated)
};
//**************************************************************************
int MouseOn(struct MENU *t); //підключення миші
void Process();
void Xorbar(int sx,int sy,int ex,int ey,int c);
void Show();
void Hide();
void Status();
//**************************************************************************
// To change the position of button just change these values here,no need
// to touch rest of the code.
struct MENU File={30,52,80,65};//координати меню File
struct MENU Edit={95,52,145,65}; //координати меню Edit
struct MENU Other={160,52,115,65}; //координати меню Other
struct MENU Help={530,52,580,65}; //координати меню Help
struct MENU Close={600,10,620,30}; //координати меню Close
struct MENU Neeraj={380,300,460,315};
//**************************************************************************
void main()
{
//Ініціалізація графіки
int gd = DETECT,gm;
initgraph(&gd, &gm,"");
Selection=NONE;
for(gd=0;gd<MAX_MENU;gd++)
{
File.Active[gd]=YES;
Edit.Active[gd]=YES;
Other.Active[gd]=YES;
Help.Active[gd]=YES;
Close.Active[gd]=YES;
}
File.head="[ File Menu ]";
Edit.head="[ Edit Menu ]";
Other.head="[Other Menu]";
Help.head="[ Help Menu ]";
Close.head="[ Exit ]";
area=imagesize(0,0,150,150);
p=malloc(area);
if(p==NULL)
{
closegraph();//закриття графічного режиму
restorecrtmode();
printf("Not Enough Memory !\n try to reduce the area used.\n");
exit(1);
}
setfillstyle(1,8);
bar(0,0,640,480);
X=2;Y=2;
Process();
closegraph();
}
//**************************************************************************
void Process()
{
char *fm[]={"New","Open","Save","Save as","Exit"}; // оголошення пунктів меню FILE
char *em[]={"Undo","Cut","Copy","Paste","Delete","Select All"}; //оголошення пунктів меню Edit
char *om[]={"MS Word 2007,MS Excel 2007, MS CALCULATION"}; //оголошення пунктів меню Other
char *hm[]={"Help Topics","About Menus"};// оголошення пунктів меню
// if you chage no. of items here then you need to chage that in
// function PullMenuDown(char *,int);
char KEY;
// draw buttons
Win(10,50,630,70);
DrawBtn(&File,"File");
DrawBtn(&Edit,"Edit");
DrawBtn(&Other,"Other");
DrawBtn(&Help,"Help");
settextstyle(1,0,0);
outtextxy(Close.x+7,Close.y+7,"x");
Comments();
Show();
// you can set active & disable item in the menu as shown below,
// here 'save as' is set to be disable.
File.Active[3]=NO;// Save as
Edit.Active[0]=NO;// undo
while(1)
{
if(kbhit())
{
KEY=getch();
if(KEY==27|| KEY==45) break;
}
Status();
if(button==1)
{
if(MouseOn(&Close)) break;
if(MouseOn(&File))
{
PullMenuDown(fm,5,&File);// no. of items = 5
if(Selection==NONE) Msg("No Selection !");
else Msg(fm[Selection]);
if(Selection==4) break;
}
if(MouseOn(&Edit))
{
PullMenuDown(em,6,&Edit);// no. of items = 6
if(Selection==NONE) Msg("No Selection !");
else Msg(em[Selection]);
}
if(MouseOn(&Help))
{
PullMenuDown(hm,2,&Help);// no. of items = 2
if(Selection==NONE) Msg("No Selection !");
else Msg(hm[Selection]);
if(Selection==1) Msg("* www.gataylo.com.ua *");
}
}
else
{
if(MouseOn(&File)) Hlight(&File);
if(MouseOn(&Edit)) Hlight(&Edit);
if(MouseOn(&Help)) Hlight(&Help);
if(MouseOn(&Other))Hlight(&Other);
if(MouseOn(&Close)) Hlight(&Close);
if(MouseOn(&Neeraj))
{
Msg("http://www.icm.lviv.net");
while(MouseOn(&Neeraj))
{
Status();
if(button!=0) break;
if(kbhit()) break;
}
Msg("");
}
}
}
Msg(":: Bye Bye ::");
}
//**************************************************************************
DrawBtn(struct MENU *tm,char *txt)
{
setcolor(9);
settextstyle(2,0,4);
outtextxy(tm->x+15,tm->y+4,txt);
}
//**************************************************************************
Hlight(struct MENU *t)
{
winp(t,0);
Msg(t->head);
while(MouseOn(t))
{
Status();
if(button!=0) break;
if(kbhit()) break;
}
setcolor(7);
Hide();
rectangle(t->x,t->y,t->x1,t->y1);
Msg("");
Show();
}
//**************************************************************************
int MouseOn(struct MENU *t)
{
int flag;
flag=0;
if(x>=t->x && x<=t->x1 && y>=t->y && y<=t->y1) flag=1;
return flag;
}
//**************************************************************************
void Xorbar(int sx,int sy,int ex,int ey,int c)
{
int i;
setwritemode(1);
setcolor(c);
Hide();
for(i=sy;i<=ey;i++)
line(sx,i,ex,i);
Show();
setwritemode(0);
}
//**************************************************************************
Push(struct MENU *tm)
{
winp(tm,1);
while(button==1)
{
Status();
if(kbhit()) break;
}
}
//**************************************************************************
Up(struct MENU *tm)
{
setcolor(7);
Hide();
rectangle(tm->x,tm->y,tm->x1,tm->y1);
Show();
while(button==1)
{
Status();
if(kbhit()) break;
}
}
//**************************************************************************
PullMenuDown(char *H[],int n,struct MENU *tm)
{
int i;
i=n*20;
// save background
Push(tm);
Hide();
getimage(tm->x+1,tm->y1+2,tm->x+100,tm->y1+i+5,p);
Win(tm->x+1,tm->y1+2,tm->x+100,tm->y1+i+5);
setcolor(12);
settextstyle(2,0,4);
for(i=0;i<n;i++)
{
if(!tm->Active[i])
{
setcolor(15);
outtextxy(tm->x+15,tm->y1+9+i*20,H[i]);
setcolor(0);
outtextxy(tm->x+14,tm->y1+8+i*20,H[i]);
}
else outtextxy(tm->x+14,tm->y1+8+i*20,H[i]);
}
Show();
while(button==1) Status();
HandleMenu(n,tm);
}
//**************************************************************************
PullMenuUp(int n,struct MENU *tm)
{
int i;
//load background
Hide();
putimage(tm->x+1,tm->y1+2,p,COPY_PUT);
Show();
Up(tm);
}
//**************************************************************************
HandleMenu(int n,struct MENU *tm)
{
int i;
char Key;
setcolor(1);
Selection=NONE;
i=0;
while(1)
{
Status();
if(button==1) break;
for(i=0;i<n;i++)
{
Status();
if(MouseOn1(tm->x+4,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20))
{
Xorbar(tm->x+3,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20,14);
while(MouseOn1(tm->x+4,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20))
{
Status();
if(button==1)
{
if(tm->Active[i]==YES)
{
Selection=i;
break;
}
else
Selection=NONE;
}
if(kbhit()) break;
}
Xorbar(tm->x+3,tm->y1+6+i*20,tm->x+97,tm->y1+22+i*20,14);
}
}
}
PullMenuUp(n,tm);
}
//**************************************************************************
MouseOn1(int cx,int cy,int cx1,int cy1)
{
int flag;
flag=0;
if(x>=cx && x<=cx1 && y>=cy && y<=cy1) flag=1;
return flag;
}
//**************************************************************************
// Mouse & win routines
//**************************************************************************
union REGS i,o;
struct SREGS ss;
void Show()
{
i.x.ax=1;
int86(0x33,&i,&o);
}
//**************************************************************************
void Hide()
{
i.x.ax=2;
int86(0x33,&i,&o);
}
//**************************************************************************
void Status()
{
i.x.ax=3;
int86(0x33,&i,&o);
button=o.x.bx;
x=o.x.cx;
y=o.x.dx;
}
//**************************************************************************
winp(struct MENU *t,int state)
{
Hide();
if(state==1)
{
setcolor(0);
line(t->x,t->y,t->x,t->y1);
line(t->x,t->y,t->x1,t->y);
setcolor(15);
line(t->x1,t->y,t->x1,t->y1);
line(t->x,t->y1,t->x1,t->y1);
}
else
{
setcolor(15);
line(t->x,t->y,t->x,t->y1);
line(t->x,t->y,t->x1,t->y);
setcolor(0);
line(t->x1,t->y,t->x1,t->y1);
line(t->x,t->y1,t->x1,t->y1);
}
Show();
}
//**************************************************************************
Win(int sx,int sy,int ex,int ey)
{
Hide();
setfillstyle(1,7);
bar(sx,sy,ex,ey);
setcolor(15);
line(sx,sy,sx,ey);
line(sx,sy,ex,sy);
setcolor(0);
line(ex,sy,ex,ey);
line(sx,ey,ex,ey);
Show();
}
//**************************************************************************
Msg(char *m)
{
int l;
setcolor(14);
rectangle(19,439,621,456);
setfillstyle(3,1);
bar(20,440,620,455);
if(MouseOn(&Neeraj))
{
settextstyle(2,0,7);
setcolor(11);
l=textwidth(m)/2;
outtextxy(320-l,440,m);
}
else
{
settextstyle(1,0,8);
setcolor(15);
l=textwidth(m)/2;
outtextxy(320-l,440,m);
outtextxy(321-l,441,m);
}
}
//**************************************************************************
Comments()
{
setfillstyle(1,8); // стиль заповнення і колір заповнення
bar(10,150,630,430); //прямокутник
setcolor(14); //колір зовнішньої рамки
rectangle(9,149,631,431); // зовнішня рамка
settextstyle(1,0,5);
setcolor(14);
settextstyle(1,0,9);
outtextxy(260,200,"IKHI KH-119");
outtextxy(158,240,"Gataylo Igor Vasilovitch");
outtextxy(158,260,"E-mail: gataylo@ukr.net");
outtextxy(158,280,"ICQ: 206-177-315");
setcolor(14);
outtextxy(370,300,"Gataylo I.V");
line(380,304+textheight("A"),380+textwidth("ICM"),304+textheight("A"));
}