Міністерство освіти інауки УкраїниФАКУЛЬТЕТ ІНФОРМАТИКИ
КАФЕДРАРеєстраційний №________
Дата ___________________КУРСОВА РОБОТА
Тема:
Скріпт мовауправління віконним інтерфейсомна С++Рекомендована до захисту
“____” __________ 2008р.
Робота захищена
“____” __________ 2008р.
з оцінкою
_____________________
Підписи членів комісії
ЗмістВступТеоріяПрактична частинаВисновкиЛітература
Вступ
Поставимо перед собою задачу створення програми скріпт мовиуправління віконним інтерфейсом. Для створення програми необхідно ознайомитися з основнимиможливостями середовища програмування С++ BILDER фірми Borland.
Замість окремого інструментарію, що оперує візуальнимиелементами керування, в C++ Builder інтегрована так називана Палітракомпонентів, розділена картотечними вкладками на кілька функціональних груп.Функціональні можливості компонентів, що поставляють, можна досить простомодифікувати, а також розробляти компоненти, що володіють зовсім новиморигінальним поводженням.
ТЕОРІЯ
Бібліотека Візуальних Компонентівдозволяє програмістам візуально створювати програмні додатки, не прибігаючибільше до кодування класів «вручну», або кодуванню в рамкахстандартних бібліотек MFC (Microsoft Foundation Class), або OWL (Object WindowsLibrary).
C++ програмістам тепер не требастворювати або маніпулювати об'єктами інтерфейсу з користувачем шляхомнаписання відповідного коду. Переважна більшість додатків ви будете розроблятивізуально за допомогою Редактора форм C++Builder, додаючи лише кілька рядківк.оброблювачам ключових події компонент. Використайте об'єкти завжди, коли цеможливо; твердо пручайтеся позиву написати новий код те тих пор, поки всі іншіможливості не будуть вичерпані.
Вам буде потрібно оперативне володінняпристроєм Бібліотеки Візуальних Компонентів. Глибина необхідних програмістам знаньпро склад і функціональні характеристики Бібліотеки визначається тим, як визбираєтеся неї використати. За допомогою команди головного меню Help | VCLReference ви можете одержувати відомості з довідкової служби в процесі роботи зБібліотекою.
VCL для прикладнихпрограмістів
Програміст створює закінчений додаток задопомогою інтерактивної взаємодії з інтегрованим візуальним середовищемC++Builder, використовуючи компоненти VCL для створення інтерфейсу програми зкористувачем і з іншими керуючими елементами: обслуговування баз даних,контрольованого уведення параметрів і т.д. Характерна для C++Builder методикавізуального стилю розробки програмного забезпечення не застосовується множиноюінших систем програмування.
Програмісти повинні знати властивості,методи й події, властивим використовуваним компонентам. Більше того, розумінняархітектури VCL дозволяє вдосконалювати вашу програму в тих місцях, девідчувається необхідність розвитку існуючих або створення нових компонентів.Перш, ніж винаходити новий елемент, упевніться, як прийнято, чи не створив ужехтось компоненту з потрібними вам характеристиками.
VCL для системнихпрограмістів
Системні програмісти розвивають існуючуБібліотеку — або додаючи в неї нові елементи, або розширюючи функціональність уженаявних компонентів. Розроблювачі компонентів повинні мати більше глибокізнання про внутрішній пристрій VCL, ніж прикладні програмісти. Потрібно чіткоуявляти собі, який прийом швидше приведе до поставленої мети: розвиток наявноїабо написання нового компонента. Написання компонентів являє собою більшетрадиційну задачу програмування й сполучено з більшими умовностями, ніжвізуальне створення додатків.
Варіанти C++Builder Professional йC++Builder Client/Server Suite поставляються разом з вихідними текстами VCL.Наявність вихідних текстів полегшує завдання програмістів, які займаютьсярозробкою нових компонентів і розширенням функціональних можливостей уженаявних компонентів Бібліотеки.
Для створення нових компонентів можна зоднаковим успіхом користуватися засобами C++Builder або Delphi, однак якщорозроблені компоненти пропонуються для зовнішнього застосування, авторзобов'язаний упевнитися, що вони працюють у рамках обох систем.
Компоненти VCL
Компоненти — це будівельні цегли, з якихконструюється інтерфейс програми з користувачем, за допомогою яких«будинок» програми здобуває новий зовнішній вигляд і схованіособливості. Для прикладного програміста будь-який компонент VCL являє собоюоб'єкт, якому можна «перетягнути» із вкладок Палітри компонент (Рис.6.1) на форму створюваного додатка. Помістивши компоненту на форму, можнаманіпулювати її властивостями (за допомогою Редактора форм) і кодом (задопомогою Редактора коду), надаючи компоненті специфічне поводження.
/>
Палітра компонентів зобраною піктограмою TLahel
Для розроблювача компонента являютьсобою об'єкти на C++ або на Об'єктному Паскале. Деякі компоненти инкапсулируютповодження типових елементів керування, надаваних операційними системамиWindows. Інші компоненти вводять зовсім нові видимі й невидимі елементи,програмний код яких повністю визначає їхнє поводження.
Складність компонентів різна. Так TLabelіз вкладки Standard Палітри компонентів здатна лише відображати статистичнийтекст. Можна сконструювати значно більше складний компонент, що, наприклад,инкапсулирует закінчене обслуговування бухгалтерських документів спеціалізованоїбази даних.
Типи компонентів
З погляду прикладногопрограміста компонентний об'єкт являє собою закінчену конструкцію, що міститьвластивості, методи й події. На відміну від розроблювача компонентів,користувачеві компонентів байдуже, від якого класу зроблений даний компонент.
Прикладные програмісти приймають якфакт, що кожен компонент має властивості Тор й Left, які визначають положеннякомпонента на формі-власнику; для них не істотно, що ці властивості успадкованівід загального попередника TComponent. Навпроти, коли ви створюєте компонент,ви зобов'язані знати, від якого батька можна запозичити потрібні вамвластивості, а також всі інші його характеристики, так, щоб їх можна булоуспадковувати, а не створювати знову.
З визначення об'єктних класів ви знаєте,що при визначенні деякого класу (спадкоємця) ви робите його від існуючогооб'єктного типу (безпосереднього попередника). Стандартний абстрактний типTObject є, за замовчуванням, першим попередником (прабатьком) всіх об'єктівБібліотеки Візуальних Компонентів.
Компоненти по суті являють собою об'єктиспеціальних типів. Лише трохи виключенні виділяють структуру компонентів іззагальних правил структурування об'єктів мовою C++:
• Більшість компонентів являють собоюелементи керування інтерфейсом з користувачем, причому деякі мають доситьскладне поводження.
• Усікомпоненти є прямими або непрямими нащадками одного загального класу-прабатьків(TComponent).
• Компоненти звичайно використаютьсябезпосередньо, шляхом маніпуляцій з їхніми властивостями; вони самі не можутьслужити базовими класами для побудови нових підкласів.
• Компоненти розміщаються тільки вдинамічній пам'яті за допомогою оператора new.
Розуміння VCL засноване на трьохфундаментальних принципах. По-перше, вам доведеться ознайомитися зіспеціальними характеристиками чотирьох базисних типів компонент: стандартногокерування, оригінального керування (custom control), графічного керування йневидимих компонентів. По-друге, ви повинні розуміти структуру Бібліотеки, уяку убудовані описи й реалізації кодів компонент. У третіх, ви повинні знатиположення згаданих чотирьох типів компонент в ієрархії VCL.
Стандартні компоненти
Деякі компоненти VCL инкапсулируютповодження таких типових елементів керування операційної системи Windows, якTButton, TListbox й TEdit. Ви знайдете стандартні компоненти на вкладкахStandard й Win95 Палітри компонентів.
Будь-який стандартний компонент виглядаєй поводити точно так само, як й инкапсулированный нею елемент керуванняWindows. VCL додає обрамлення, що ніяк не міняє властивостей вихідного елементакерування, а лише робить доступної модифікацію виду й поводження компоненти задопомогою властивостей і методів.
Якщо ви збираєтеся використатистандартні компоненти без змін, вам не потрібно вникати в правила побудовиобрамлень VCL. Розроблювач компонентів може відкрити файл вихідних текстівстандартних компонентів, що входить у поставку версій C++Builder Professionalабо Client/Server Suite, щоб зрозуміти, яким образом відомі елементи керуванняWindows обрамляються при включенні в Бібліотеку.
Наприклад, компонента TListBoxвідображає елементи списку в один стовпець, хоча инкапсулирует клас простогосписку LISTBOX з Windows, що може відображати список у кілька стовпців. Щобзмінити поводження компонента, вам доведеться реалізувати перевантаження методустворення даного компонента, прийнятого за замовчуванням.
Оригінальні компоненти
На відміну від стандартних компонентів,оригінальні компоненти являють собою елементи керування, у яких немає ні методудля власного відображення, ні заздалегідь певного поводження. Розроблювачкомпонентів повинен передбачити код, що реалізує малювання самого компонента йкод, що визначає поводження компонента, коли користувач взаємодіє з нею. Прикладамиоригінальних компонентів є TPanel й TStringGrid.
Слід зазначити, що як стандартні, так йоригінальні компоненти завжди асоціюються з деяким вікном керування, тому інодіназиваються віконними (windowed components). Даний аспект докладнообговорюється в параграфі, що описує клас TWinControl. Віконні компоненти маютьнаступні властивості: вони можуть бути активізовані (прийняти фокус уведення),використають системні ресурси й можуть служити контейнерами, тобто бутиродителями інших елементів керування. Прикладом контейнерного компонента є TPanel.
Графічні компоненти
Графічні компоненти являють собою видиміелементи керування, які не можуть прийняти фокус уведення, тому що не євіконними. Графічні компоненти забезпечують відображення об'єктів безвикористання системних ресурсів, вони вимагають менших «накладнихвитрат», ніж стандартні або оригінальні компоненти. Прикладами графічнихкомпонентів є TImage й TShape.
Графічні компоненти не можуть служитиконтейнерами для інших елементів керувань, тобто не можуть володіти іншимикомпонентами.
Невидимі компоненти
Під час виконання програми невидимікомпоненти не з'являються на формі у вигляді яких-небудь елементів керування.Поводження невидимих компонентів визначається на етапі проектування, шляхомінкапсуляції потрібних властивостей об'єкта.
За допомогою Інспектора об'єктів виможете модифікувати властивості невидимих компонентів і передбачати кодоброблювачів подій для них. Прикладами таких компонентів є TOpenDialog, TTableабо TTimer.
Контейнерні компоненти
Деякі компоненти в VCL можуть володітиіншими компонентами або бути родителями інших компонентів. Зазначені аспектимають різне значеннєве значення, що й проясняється в наступних параграфах.
Право володіння
Будь-який компонент може перебувати у володінні(ownership) інших компонентів, але не все компоненти можуть бути власниками.Властивість компонента
Owner (Власник) містить посилання накомпонент, що нею володіє. Рис. 6.2 показує ієрархію володіння деякої форми.
/>
Приклад ієрархіїволодіння
Власник відповідає за звільнення тихкомпонентів, якими володіє, коли сам руйнується. Так у процесі конструюванняформи, вона автоматично стає власником всіх компонентів, розміщених на ній,навіть якщо частина їх розміщена на іншому компоненті, такий як TPanel.Володіння застосовне не тільки до видимих, але й до невидимого (Ttimer,DataSource) компонентам.
Коли компонента створюється динамічно впроцесі виконання програми, конструкторам компонента передається її власник якпараметр. У наступному прикладі неявний власник форми (this) передаєтьсяконструкторові компонента TButton як параметр. TButton виконає присвоюваннязначення переданого параметра властивості Owner кнопки MyButton:
MyButton = new TButton(this);
Коли форма, що володіє компонентомTButton звільняється, автоматично знищується й кнопка MyButton.
Ви можете створити компоненту, у якоїнемає власника, передаючи значення параметра 0 конструкторові компоненти.Однак, коли цей компонент перестає бути потрібної, її знищення виконуєтьсяпримусово (за допомогою оператора delete). Наступний приклад ілюструє обіг зкомпонентом TTable, що не має власника:
TTable* MyTable = new TTable(0)
// Код, що реалізує роботу з MyTable
deleteMyTable;
Властивість Components типу масивмістить перелік компонентів, якими володіє даний компонент. Листинг 6.1 міститьфрагмент коду оброблювача події OnClick із циклом відображення імен класів всіхкомпонентів, якими володіє деяка форма.
void _fastcallTForm::ButtonlClick(TObject *Sender) {
for (inti=0; i
ShowMessage(Components[i]->ClassName());
}
Батьківське право
Поняття батьківського права (parentship)істотно відрізняється від права володіння й застосовно тільки до видимого(віконним) компонентам.Батько компонента не може бути її власником.
Батьківські компоненти звертаються довідповідних внутрішніх функцій, щоб викликати відображення компонентів-нащадків.Батько також ответствен за звільнення своїх нащадків, коли сам батькознищується. Властивість компонента Parent (Батько) містить посилання накомпонент, що є її батьком. показує батьківську ієрархію деякої форми.
/>
Приклад батьківськоїієрархії
Багато властивостей видимих компонентів(наприклад. Left, Width, Top, Height) ставляться до батьківських елементівкерування. Інші властивості (наприклад, ParentColor й ParentFont) дозволяютьнащадкам використати властивості батьків.
До віконних компонентів ставляться таківидимі елементи, як TEdit, TListBox й TMemo. Щоб відобразити віконнийкомпонент, їй треба привласнити батька, відповідального за відображення. Цеприсвоювання виконується автоматично на стадії проектування, коли виперетаскуєте потрібний компонент із Палітри компонентів на форму. Навпроти, пристворенні компонента під час виконання програми ви повинні явно записати цеприсвоювання, інакше компонента не буде відображена (Листинг 6.2).
void _fastcallTForm::FormCreate(TObject *Sender)
{
MyEdit = new TEdit(this); // Передатиthis як власника MyEdit->Parent = this; // Передати this як батька
}
Потоковість
Потоковість (streaniabilily)компоненти виражається в способі зберігання самого компонента й інформації, щоставиться до значень її властивостей, у файлі або у відведеній області пам'яті.Наприклад, створюваний C++Builder ресурсний файл із расширением.dfm міститьінформацію про форму й компоненти, розміщених на ній. Ця інформація автоматичноскидається в потік ресурсного файлу.
Розроблювачі компонентів VCL повиннірозбиратися в механізмі потокового уведення/висновку, оскільки їм доведетьсявручну скидати в потік спеціальні дані про нові компоненти. VCL не автоматизуєцей процес.
Властивості компонентів
Визначення класу в мові C++ міститьінкапсуляцію членів даних і методів, що оперують із даними й визначаютьповодженням об'єкта. Ця концепція всіх систем ООП прийнята в VCL.
VCL дозволяє маніпулювати видом іфункціональним поводженням компонент не тільки за допомогою методів (як церобиться зі звичайними класами), але й за допомогою властивостей і подій,властивим тільки класам компонент.
Властивості являють собою розширенняпоняття членів даних. Дозволено будь-які типи властивостей, за виняткомфайлового типу. На відміну від члена даних, властивість не зберігає дані, однакйого методи читання й запису дозволяють одержати доступ до захищеного членаданих об'єкта.
Таким чином, присвоювання значення членуданих за допомогою присвоювання властивості викликає «побічнийефект», за яким можуть ховатися складні операції над компонентом.Наприклад, побічний ефект при зміні властивості Caption (Назва) деякої формипроявляється в негайній зміні назви заголовка вікна цієї форми, при відсутностіявного звертання до методу, що реалізує операцію зміни заголовка.
Практична частина Лістінгпрограм
Програма– скрипкова оболонка графічного інтерфейсу (програма управління інтерфейсомкористувача)
#include
#include
int dotX=230,dot=1;
/************************************************************************/
/**************************** MenuGenerator*****************************/
/************************************************************************/
void buildMenu(char *ScrF,char *OutF)
{
char F_Ch,tmpint[3];
int EOS=0,WriMode,tmpcnt=-1;
char DUMP[80];
FILE *EngF,*TarF;
if((EngF=fopen(ScrF,«r»))!=NULL)
{
TarF=fopen(OutF,«w»);
while(!EOS)
{
fflush(stdin);
F_Ch=fgetc(EngF);
if(F_Ch!='\2')fputc(F_Ch,TarF);
else
{
WriMode=2;
F_Ch=fgetc(EngF);
switch(F_Ch)
{
case '*': fgets(DUMP,sizeof(DUMP),EngF);break;
case '#': EOS=1;break;
case '1':itoa(ScrItem.MenuBKColor,tmpint,10);
fputs(tmpint,TarF);break;
case '2':itoa(ScrItem.BorderColor,tmpint,10);
fputs(tmpint,TarF);break;
case '3':itoa(ScrItem.MenuColor,tmpint,10);
fputs(tmpint,TarF);break;
case '4':itoa(ScrItem.BorderTxtColor,tmpint,10);
fputs(tmpint,TarF);break;
case '5':fputs(ScrItem.TitleTxt,TarF);break;
case '6':fputs(ScrItem.AuthorTxt,TarF);break;
case '7':itoa(ScrItem.TxtColor,tmpint,10);
fputs(tmpint,TarF);break;
case '8':fputs(ScrItem.MenuAskTxt,TarF);break;
}
if(dot==1)
{
Shadow(".",dotX,230,15);dotX+=8;
dot=0;
}else dot=1;
/* Found Wanted Menu */
if(WriMode==1)
{
tmpcnt=-1;
while(WriMode!=2)
{
F_Ch=fgetc(EngF);
if(F_Ch!='\2')fputc(F_Ch,TarF);
else
{
F_Ch=fgetc(EngF);
switch(F_Ch)
{
case '*':fgets(DUMP,sizeof(DUMP),EngF);break;
case '/': WriMode=2;break;
}
}
}
}
/* Found Unwanted Menu, Dump whole part */
else if(WriMode==0)
{
while(WriMode!=2)
{
F_Ch=fgetc(EngF);
if(F_Ch!='\2')fgets(DUMP,sizeof(DUMP),EngF);
else
{
F_Ch=fgetc(EngF);
if(F_Ch=='/')WriMode=2;
}
}
}
}
}
fclose(EngF);
fclose(TarF);
}
}
void MenuGenerator()
{
Win3D(170,195,285,80,8);
Box3D(170,195,285,80,1);
Box3D(172,197,281,76,0);
Shadow(«Generating Menu Soure code»,200,210,15);
buildMenu(«cMenu.scr»,«Menu.c»);
buildMenu(«pasMenu.scr»,«Menu.pas»);
/*== Produce Menu File ==*/
Shadow(" [ Done ]",dotX,230,15);
Shadow(«Menu.C & Menu.PAS generated!»,200,250,15);
getch();
ClrbyLine();
/*End of Production*/
}
/***************************************************************************
** Author: Ong Hui Lam **
** Library Name: GUI12h — Graphics UserInterface for 12h mode **
** Desciption: A 12h mode (640x480 16 colors) GUIrountine **
***************************************************************************/
#include
#include
#include
#include
#include
#include
#include
void GDrv();
void ClrbyLine();
void Button(char Btxt[],int Bx,int By,int BFloat);
void CheckBox(int IcoX,int IcoY,int Checked);
void OptBox(int IcoX,int IcoY,int Checked);
void Win3D(int Winx,int Winy,int Winw,int Winh,intWinCol);
void Win(int Winx,int Winy,int Winw,int Winh,intWinCol);
void Box3D(int BoxX,int BoxY,int BoxW,int BoxH,intBoxFloat);
void Box(int BoxX,int BoxY,int BoxW,int BoxH,intBoxCol);
void Shadow(char Txt[],int TxtX,int TxtY,intTxtCol);
void TextBox(int Tx,int Ty,int Tw,int Th,charTxt[]);
const char *ComboBox(int Tx,int Ty,int Tw,const char*Opt[],int OptCnt);
/***************************************************************************
** Module Name: GDrv **
** **
** Description: Initialize to 12h graphics mode,640x480 16 colors. **
***************************************************************************/
void GDrv()
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode,"");
errorcode = graphresult();
if(errorcode != grOk)
{
printf(«Graphics error: %s\n»,grapherrormsg(errorcode));
getch();exit(1);
}
return;
}
/***************************************************************************
** Module Name: Shadow **
** **
** Desciption: Output the text on screen withshadow effect **
** **
** Parameters: Txt => Output String **
** TxtX => Coordinate-X of the output string **
** TxtY => Coordinate-X of the output string **
** TxtCol => Color of the output string **
***************************************************************************/
void Shadow(char Txt[],int TxtX,int TxtY,int TxtCol)
{
setcolor(0);outtextxy(TxtX+1,TxtY+1,Txt);
setcolor(TxtCol);outtextxy(TxtX,TxtY,Txt);
return;
}
/***************************************************************************
** Module Name: Box **
** **
** Desciption: Draw a Square Frame with desiredcolor **
** **
** Parameters: BoxX => Coordinate-X of the Box **
** BoxY => Coordinate-Y of the Box **
** BoxW => Width of the Box **
** BoxH => Height of the Box **
** BoxCol => Color of the Box Line **
***************************************************************************/
void Box(int BoxX,int BoxY,int BoxW,int BoxH,intBoxCol)
{
setcolor(BoxCol); /*== Set Line Color ==*/
line(BoxX,BoxY,BoxX,BoxY+BoxH); /*== Left Line ==*/
line(BoxX+BoxW,BoxY,BoxX+BoxW,BoxY+BoxH); /*==Right Line ==*/
line(BoxX,BoxY,BoxX+BoxW,BoxY); /*== Top Line ==*/
line(BoxX,BoxY+BoxH,BoxX+BoxW,BoxY+BoxH); /*==Bottom Line ==*/
return;
}
/***************************************************************************
** Module Name: Box3D **
** **
** Desciption: Draw a Square Frame with 3D effect **
** **
** Parameters: BoxX => Coordinate-X of the Box **
** BoxY => Coordinate-Y of the Box **
** BoxW => Width of the Box **
** BoxH => Height of the Box **
** BoxFloat => «1» indicate floateffect **
** «0» indicate sink effect **
***************************************************************************/
void Box3D(int BoxX,int BoxY,int BoxW,int BoxH,intBoxFloat)
{
if(BoxFloat==1)setcolor(15);else setcolor(0);
line(BoxX,BoxY,BoxX,BoxY+BoxH); /*== Left Line ==*/
line(BoxX,BoxY,BoxX+BoxW,BoxY); /*== Top Line ==*/
if(BoxFloat==1)setcolor(0);else setcolor(15);
line(BoxX,BoxY+BoxH,BoxX+BoxW,BoxY+BoxH); /*==Bottom Line ==*/
line(BoxX+BoxW,BoxY,BoxX+BoxW,BoxY+BoxH); /*==Right Line ==*/
return;
}
/***************************************************************************
** Module Name: Win **
** **
** Desciption: Draw a color filled Windows **
** **
** Parameters: Winx => Coordinate-X of Win **
** Winy => Coordinate-Y of Win **
** Winw => Width of Win **
** Winh => Height of Win **
** WinCol => Win filled color **
** LineCol => Win frame line color **
***************************************************************************/
void Win(int Winx,int Winy,int Winw,int Winh,intWinCol)
{
setfillstyle(1,WinCol);
bar(Winx,Winy,Winx+Winw,Winy+Winh);
return;
}
/***************************************************************************
** Module Name: Win3D **
** **
** Desciption: Draw a color filled Windows with 3Deffect **
** **
** Parameters: Winx => Coordinate-X of Win **
** Winy => Coordinate-Y of Win **
** Winw => Width of Win **
** Winh => Height of Win **
** WinCol => Win filled color **
** LineCol => Win frame line color **
***************************************************************************/
void Win3D(int Winx,int Winy,int Winw,int Winh,intWinCol)
{
Win(Winx,Winy,Winw-1,Winh-1,WinCol); /*== Draw theWindows ==*/
setfillstyle(1,0); /*== set fill color to Black==*/
bar(Winx+10,Winy+Winh,Winx+Winw+10,Winy+Winh+10);/*== Bottom Shadow ==*/
bar(Winx+Winw,Winy+10,Winx+Winw+10,Winy+Winh+10);/*== Right Shadow ==*/
return;
}
/***************************************************************************
** Module Name: OptBox **
** **
** Desciption: Allow selection made from a groupof option. **
** Suitable for option where allow one selection **
** among the choice available. **
** **
** Parameters: IcoX => Coordinate-X of OptBox **
** IcoY => Coordinate-Y of OptBox **
** Checked => Value of OptBox **
** «0» indicate Unchecked **
** «1» indicate Checked **
***************************************************************************/
void OptBox(int IcoX,int IcoY,int Checked)
{
/*= 8x8 pixels 3D Round Button bitmap ==*/
int ICOMAP[8][8]=
{
-1,0,0,0,0,0,15,-1,0,0,7,7,7,7,7,15,
0,7,7,7,7,7,7,15,0,7,7,7,7,7,7,15,
0,7,7,7,7,7,7,15,0,7,7,7,7,7,7,15,
15,7,7,7,7,7,15,15,-1,15,15,15,15,15,15,-1
};
int IcoCnt,IcoCnt2;
/*== Plot the 8x8 pixel 3D round button on screen==*/
for(IcoCnt=0;IcoCnt
{
for(IcoCnt2=0;IcoCnt2
{
if(ICOMAP[IcoCnt2][IcoCnt]!=-1)
putpixel(IcoX+IcoCnt2,IcoY+IcoCnt,ICOMAP[IcoCnt2][IcoCnt]);
}
}
/*== if checked then plot the black dot on theround button ==*/
if(Checked==1)
{
setcolor(0);
line(IcoX+2,IcoY+3,IcoX+5,IcoY+3);
line(IcoX+2,IcoY+4,IcoX+5,IcoY+4);
line(IcoX+3,IcoY+2,IcoX+4,IcoY+2);
line(IcoX+3,IcoY+5,IcoX+4,IcoY+5);
}
return;
}
/***************************************************************************
** Module Name: CheckBox **
** **
** Desciption: As a check list for options. **
** **
** Parameters: IcoX => Coordinate-X of CheckBox**
** IcoY => Coordinate-Y of CheckBox **
** Checked => Value of CheckBox **
** «0» indicate Unchecked **
** «1» indicate Checked **
***************************************************************************/
void CheckBox(int IcoX,int IcoY,int Checked)
{
int IcoCnt,IcoCnt2;
Win(IcoX,IcoY,9,9,7);
Box3D(IcoX,IcoY,9,9,0);
if(Checked==1)
{
setcolor(0);
line(IcoX+7,IcoY+2,IcoX+2,IcoY+7); //RTop — LBottom
line(IcoX+2,IcoY+2,IcoX+7,IcoY+7);//LTop — RBottom
}
return;
}
/***************************************************************************
** Module Name: Button **
** **
** Desciption: Trigeable button with caption. **
** **
** Parameters: Btxt[] => Caption of the button **
** Bx => Coordinate-X **
** By => Coordinate-Y **
** BFloat => Button Effect **
** 1 = Float, Unpressed **
** 0 = Sink, Pressed **
***************************************************************************/
void Button(char Btxt[],int Bx,int By,int BFloat)
{
int Bw=strlen(Btxt)*8+16;
setfillstyle(1,7);
bar(Bx,By,Bx+Bw,By+15);
setcolor(0);
outtextxy(Bx+8,By+4,Btxt);
Box3D(Bx,By,Bw,15,BFloat);
return;
}
/***************************************************************************
** Module Name: ClrbyLine **
** **
** Desciption: Clearing Effect that clear line byline **
** **
***************************************************************************/
void ClrbyLine()
{
int ly;
setcolor(0);
for(ly=45;ly
for(ly=390+44;ly>45;ly-=2){line(29,ly,29+572,ly);delay(1);}
return;
}
/***************************************************************************
** Module Name: TextBox **
** **
** Desciption: As a Input area to accept string **
** **
** Parameters: Tx => Coordinate-X of thetextbox **
** Ty => Coordinate-Y of the textbox **
** Tw => Width of the textbox **
** Th => Height of the textbox **
** Txt => textbox's string to be output **
***************************************************************************/
void TextBox(int Tx,int Ty,int Tw,int Th,char Txt[])
{
Win(Tx,Ty,Tw,Th,7);
Box3D(Tx-1,Ty-1,Tw+2,Th+2,0);
setcolor(0);
outtextxy(Tx+5,Ty+3,Txt);
return;
}
/***************************************************************************
** Function Name: ComboBox **
** **
** Desciption: Allow user choice to be madethrough list combo **
** style by triggle , and . **
** **
** Parameters: Tx => Coordinate-X for theComboBox. **
** Ty => Coordinate-Y for the ComboBox. **
** Tw => Width of the ComboBox. **
** Opt => The List of selection string. **
** Allowed Maximum of 50 array of string. **
** OptCnt => Total Number of choice. **
***************************************************************************/
const char *ComboBox(int Tx,int Ty,int Tw,const char*Opt[],int OptCnt)
{
int ComboCnt=0,Th=12;
char ComboK=1,FKey=0;
char Fstr[80];
/*== Draw ComboBox==*/
Win(Tx,Ty,Tw,Th,7);
Box3D(Tx-1,Ty-1,Tw+2,Th+2,0);
Box3D(Tx+Tw-31,Ty,15,Th,1); /*== Draw Up ArrowButton ==*/
Box3D(Tx+Tw-15,Ty,15,Th,1); /*== Draw Down ArrowButton ==*/
settextstyle(0,0,0);
setcolor(8);
outtextxy(Tx+Tw-27,Ty+3,"\36");/*== WriteUp Arrow ==*/
/*== If list not empty paint Down Arrow with BLACK==*/
if(OptCnt!=0)setcolor(0);
outtextxy(Tx+Tw-11,Ty+3,"\37");/*== WriteDown Arrow ==*/
strcpy(Fstr,"");
while(ComboK!=13&&OptCnt!=0)
{
Win(Tx+5,Ty+2,Tw-40,Th-4,7);
setcolor(0);
outtextxy(Tx+5,Ty+3,Opt[ComboCnt]);
ComboK=getch();
switch(ComboK)
{
case 0:FKey=getch();
switch(FKey)
{
case 72: /*== If not first item==*/
if(ComboCnt>0)
{
/*== Show Up ButtonPressed Effect ==*/
Box3D(Tx+Tw-31,Ty,15,Th,0);
delay(100);
Box3D(Tx+Tw-31,Ty,15,Th,1);
/*== Decrease ComboCnt,point to previous item ==*/
ComboCnt--;
}
break;
case 80: /*== If not last item==*/
if(ComboCnt
{
/*== Show Down ButtonPressed Effect ==*/
Box3D(Tx+Tw-15,Ty,15,Th,0);
delay(100);
Box3D(Tx+Tw-15,Ty,15,Th,1);
/*== Increase ComboCnt,point to next item ==*/
ComboCnt++;
}
break;
}
/*== GREY if not avaible, BLACK ifavailable ==*/
/*== If current item is first item, show not avaible==*/
if(ComboCnt==0)setcolor(8);elsesetcolor(0);
outtextxy(Tx+Tw-27,Ty+3,"\36");//up
/*== If current item is last item, show not avaible==*/
if(ComboCnt==OptCnt-1)setcolor(8);else setcolor(0);
outtextxy(Tx+Tw-11,Ty+3,"\37");//down
break;
case 13: /*== Pressed, copy currentitem to Fstr for return ==*/
strcpy(Fstr,Opt[ComboCnt]);break;
}
}
return Fstr;
}
/***********************************************************************/
/************************** End of GUI12h******************************/
/***********************************************************************/
/* Standard Library */
#include
#include
#include
/* User Defined Library Routines */
#include «GUI12H.C»
#include «COMCTRL.C»
#include «SCR_MOD.C»
#include «SCR_CODE.C»
void WebICO(int IcoX,int IcoY)
{
int IcoCnt,IcoCnt2;
const int ICOMAP[15][18]=
{
-1,-1,15,-1,-1,-1,-1,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,15,15,-1,15,15,15,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,-1,-1,15,15,-1,0,15,15,15,-1,-1,-1,-1,-1,-1,15,-1,
-1,-1,15,-1,15,15,-1,15,0,0,15,15,-1,15,15,15,-1,0,
-1,-1,15,0,-1,15,15,15,15,15,-1,15,15,15,0,0,0,-1,
15,15,15,15,-1,15,15,0,15,0,15,-1,0,15,0,-1,-1,-1,
-1,0,15,15,15,15,0,15,-1,15,15,15,15,15,0,-1,-1,-1,
-1,-1,15,0,0,15,15,-1,15,-1,15,0,0,15,15,15,15,-1,
-1,-1,15,15,15,15,15,15,15,15,15,0,-1,-1,15,0,0,0,
-1,-1,15,15,0,0,0,15,0,0,15,15,-1,15,-1,0,-1,-1,
15,15,15,0,15,15,15,15,15,-1,-1,15,0,15,0,-1,-1,-1,
-1,0,0,0,-1,0,15,0,0,15,15,15,15,-1,0,-1,-1,-1,
-1,-1,-1,-1,-1,-1,15,0,-1,-1,0,0,15,0,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,15,0,-1,-1,-1,-1,-1,15,-1,-1,-1,-1,
-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,0,-1,-1,-1
};
for(IcoCnt=0;IcoCnt
{
for(IcoCnt2=0;IcoCnt2
{
if(ICOMAP[IcoCnt2][IcoCnt]!=-1)
putpixel(IcoX+IcoCnt,IcoY+IcoCnt2,ICOMAP[IcoCnt2][IcoCnt]);
}
}
return;
}
void MailICO(int IcoX,int IcoY)
{
int IcoCnt,IcoCnt2;
const int ICOMAP[10][16]=
{
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,-1,
15,9,9,12,12,9,9,12,12,9,9,12,12,9,7,0,
15,12,15,15,15,15,15,15,15,15,15,15,15,9,7,0,
15,12,15,15,15,15,15,15,15,15,15,15,15,12,7,0,
15,9,15,15,15,15,15,15,15,15,15,15,15,12,7,0,
15,9,15,15,15,15,15,15,15,15,15,15,15,9,7,0,
15,12,15,15,15,15,15,15,15,15,15,15,15,9,7,0,
15,12,9,9,12,12,9,9,12,12,9,9,12,12,7,0,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,
-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
for(IcoCnt=0;IcoCnt
{
for(IcoCnt2=0;IcoCnt2
{
if(ICOMAP[IcoCnt2][IcoCnt]!=-1)
putpixel(IcoX+IcoCnt,IcoY+IcoCnt2,ICOMAP[IcoCnt2][IcoCnt]);
}
}
return;
}
int main()
{
registerbgifont(gothic_font);
registerbgifont(small_font);
registerbgidriver(EGAVGA_driver);
GDrv();
settextstyle(2,0,0);
WebICO(100,450);Shadow(«members.xoom.com/_XOOM/huilam/»,130,450,10);
MailICO(400,452);Shadow(«huilam@pl.jaring.my»,430,450,10);
settextstyle(0,0,0);
Shadow(«Menu Builder v1.0 for Pascal & C»,20,20,10);
if(ScrDesign()==1)MenuGenerator();
closegraph();
return 0;
}
ПРИКЛАД РОБОТИ ПРОГРАМИ
Головне вікно програми побудови інтерфейсукористувача та введення системних команд
/>
Висновки
Операційна система Windows надаєрозроблювачам додатку потужні засоби Інтерфейсу Графічних Пристроїв GDI(Graphics Device Interface) для побудови графічних зображень незалежно від типувикористовуваного пристрою висновку. На жаль, GDI обтяжує програмістів множиноюдодаткових дій (зокрема, по керуванню системними ресурсами), які відволікаютьрозроблювача від його основної задачі — створення графіки. C++Builder бере насебе всю допоміжну роботу GDI, звільняючи розроблювачів від непродуктивногопрограмування з пошуком загублених дескрипторів зображень і не звільненихресурсів пам'яті. Це зовсім не означає, що прямий обіг додатків до окремихфункцій Windows GDI забороняється — ви завжди зможете при необхідностівикликати їх. Однак, інкапсуляція графічних функцій Windows візуальнимикомпонентами являє собою більше перспективну методику створення графіки увашому додатку.
Література
1. Нейбауэр А. Моя перваяпрограмма на С/С++. П., 1995. 368 С.
2. Бруно Бабэ. Просто и ясно оBorland C++. М., 1996. 400 С.
3.ObjectWindows дляC++. К., 1993., 208 С.
4. Н. Барканати.Программирование игр для Windows на Borland C++. М., 1994.