Obsah:
Podrobn² popis funkcφ
ZniΦOkno - 2.1
P°esu≥Okno - 2.2
Obnov - 2.3
P°idejPolo₧ku - 2.4
MenuV²b∞rP°idejPolo₧ku - 2.5
Spus¥PopUpMenu - 2.6
_KresliMenu - 2.7
Spus¥Menu - 2.8
Menu - 2.9
_KresliV²b∞r - 2.10
Spus¥V²b∞r - 2.11
V²b∞r - 2.12
_KresliP°epφnaΦ - 2.13
P°epφnaΦ - 2.14
_KresliVypφnaΦ - 2.15
VypφnaΦ - 2.16
_KresliTextovΘPole - 2.17
UpravTextovΘPole - 2.18
TextovΘPole - 2.19
_KresliText - 2.20
Text - 2.21
_KresliTlaΦφtko - 2.22
TlaΦφtko - 2.23
_KresliOkno - 2.24
Okno - 2.25
P°φklady - 3.0
3.1 "Hello, World!"
3.2 PopUp Menu
3.3 Dialog
D∙le₧itß upuzorn∞nφ a omezenφ 4.0
Soubory:
GUI.SGP - zdrojovß knihovna
GUI_VDEV.SGP - VDev (visußlnφ v²voj)
GUI.PAL - paleta barev windows
S pomocφ tΘto knihovny + v nφ vytvo°enΘho programu VDev (Visual Developer - vi sußlnφ v²voj) a trochou programßtorskΘho umu, m∙₧ete jednoduÜe vytvß°et programy vyu₧φvajφcφ GrafickΘ U₧ivatelskΘ Prost°edφ. Parametry vÜech objekt∙ jsou ulo₧eny v hlavnφm poli Objekty. To mß nßsledujφcφ slo₧ky:
struct GUIObjekt { int èφ°ka,V²Üka, X,Y, Okno, /* Okno, ke kterΘmu objekt nßle₧φ. */ ID; /* Pracovnφ identifikaΦnφ Φφslo. */ char Spec, /* Specifickß prom∞nnß (nap°. stav u vypφnaΦe). */ Druh, /* Druh objektu (nap°. 0=Okno,1=TlaΦφtko ...). */ Styl, /* Styl objektu (nap°. v p°φpad∞ tlaΦφtka 0=obyΦejnΘ,1=plochΘ ...). */ Viditeln², /* Viditelnost objektu (1=viditeln²,0=neviditeln²) */ Skupina, /* V p°φpad∞ p°epφnaΦe urΦuje skupinu. */ P°i°azenaUdßlost; /* No Comment ;) */ string Text; /* Text, kter² je na objektu napsßn. */ void (*Klik)(), /* Udßlost klik na objekt */ (*Zm∞na)(), /* Udßlost zm∞na hodnoty (nap°. zm∞na textovΘho pole, zm∞na stavu vypφnaΦe ... */ (*PopUp)(); /* Udßlost vybrßnφ polo₧ky PupUp menu */ } Objekty[105]; /* Hlavnφ pole, kterΘ zdru₧uje vÜechny objekty.(index=ID) */
Objekt vytvo°φme tak ,₧e do prom∞nnΘ p°i°adφme typu int v²sledek odpovφdajφcφ funkce nap°. Tl1=TlaΦφtko(50,50,70,20,0,Okno1,"Tl1",&Tl1Klik,NULL); (viz 2.23) . V prom∞nnΘ Tl1 te∩ mßme ID (identifikaΦnφ Φφslo) objektu. K jeho parametr∙m se dostaneme tkato: Objekty[Tl1].Text="GUI"; Tφm ovÜem zm∞nφme pouze hodnotu prom∞nnΘ, ale na obrazovce z∙stane stßle "Tl1". Proto j∞st∞ zadßme Obnovit=1; To zajistφ, ₧e p°i dalÜφm voßnφ funkce Udßlosti se obrazovka obnovφ.Konec programu provedeme tak, ₧e do prom∞nnΘ Konec p°i°adφme 1 (Konec=1;).
ZniΦφ (vyma₧e ho z pole Objekty) okno s identifikaΦnφm Φφslem ID. Nastavφ Obnovit na 1.
P°esune okno s identifikaΦnφm Φφslem ID a vÜechny jemu nßle₧φcφ objekty na pozici x,y.
Znovu postupn∞ vykreslφ vÜechny viditelnΘ objekty.
P°idß polo₧ku s textem text do PopUp menu objektu s identifikaΦnφm Φφslem ID.
P°idß polo₧ku s textem text do seznamu polo₧ek V²b∞ru nebo Menu s identifikaΦnφm Φφslem ID.
Zobrazφ PopUp menu objektu s identifikaΦnφm Φφslem ID na pozici x2,y2. Navracφ Φφslo vybranΘ polo₧ky.
Nakreslφ menu s identifikaΦnφm Φφslem ID. Pokud je z=1 nakreslφ se ve zmßΦlΘm stavu.
Zobrazφ spuÜt∞nΘ Menu s identifikaΦnφm Φφslem ID. Navracφ Φφslo vybranΘ polo₧ky.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) Menu na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). Navracφ ID.
Nakreslφ v²b∞r s identifikaΦnφm Φφslem ID. Pokud je z=1 nakreslφ se ve zmßΦklΘm stavu.
Zobrazφ spuÜt∞n² V²b∞r s identifikaΦnφm Φφslem ID. Navracφ Φφslo vybranΘ polo₧ky.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) V²b∞r na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). Navracφ ID.
Nakreslφ p°epφnaΦ s identifikaΦnφm Φφslem ID.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) p°epφnaΦ na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). skupina udßvß skupinu p°epφnaΦ∙. stav znaΦφ oznaΦenφ (0=neoznaΦen², 1=oznaΦen²). Navracφ ID.
Nakreslφ vypφnaΦ s identifikaΦnφm Φφslem ID.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) vypφnaΦ na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). stav znaΦφ oznaΦenφ (0=neoznaΦen², 1=oznaΦen²). Navracφ ID.
Nakreslφ vypφnaΦ s identifikaΦnφm Φφslem ID.
Spustφ ·pravu textovΘho pole s identifikaΦnφm Φφslem ID. Navracφ zadan² °et∞zec.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) textovΘ pole na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). styl znaΦφ typ zadanΘ hodnoty - 1 °et∞zec 2 celΘ Φφslo (int) 3 des. Φφslo (double) . Navracφ ID.
Nakreslφ vypφnaΦ s identifikaΦnφm Φφslem ID.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) Text na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). Navracφ ID.
Nakreslφ tlaΦφtko s identifikaΦnφm Φφslem ID. Pokud je z=1 nakreslφ se ve zmßΦklΘm stavu.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) tlaΦφtko na pozici x,y od pravΘho hornφho rohu okna okno s textem text a udßlostmi udßlost(=klik) a popup(=spuÜt∞nφ PopUp menu). styl znaΦφ vzhled tlaΦφtka - 1 normßlnφ 2 plochΘ. Navracφ ID.
Nakreslφ okno s identifikaΦnφm Φφslem ID. Hodnoty z - 0 nezmßΦkle vykreslφ celΘ okno 1 zmßΦkle nevykreslφ celΘ okno 2 nezmßΦkle nevykreslφ celΘ okno.
Vytvo°φ (p°i°adφ vlastnosti+vykreslφ) okno na pozici x,y od pravΘho hornφho rohu obrazovky s textem text a udßlostmi udßlost(=k°φ₧ek) a popup(=spuÜt∞nφ PopUp menu). Navracφ ID.
V₧dy prvnφ program ("Ahoj, sv∞te!"). Zkopφrujeme soubor GUI.Sgp jako Pokus.Sgp. V Baltazarovi otev°eme program Pokus.
Globaßlnφ prom∞nnΘ(Ctrl+G):
int Okno1,Text1,Tl1;
P°φkaz 2, funkce Init:
Okno1=Okno(220,140,200,200,"1. Program",NULL,NULL); Text1=Text((200-StrDΘlka("Ahoj, sv∞te!")*8)/2,(200-10)/2,Okno1,"Ahoj, sv∞te!",NULL,NULL); Tl1=TlaΦφtko((200-70)/2,170,70,25,0,"Konec",Okno1,Tl1Klik,NULL);
NULL znamenß ₧e na tuto udßlost nechceme reagovat. Musφme vytvo°it novou funkci Tl1Klik, do kterΘ napφÜeme toto:
:konec=1!
Jakmile u₧ivatel klikne na tlaΦφtko Tl1, zavolß se funkce Tl1Klik aprogram se ukonΦφ.
Vyu₧ijeme p°edchozφ program. Do p°φkazu 2 funkce Init p°idßme toto:
P°idejPolo₧ku(Okno1,"Zm∞≥"); P°idejPolo₧ku(Okno1,"Zp∞t");
Poznßmka: V p°φpad∞, ₧e chceme mφt v polo₧ce text delÜφ ne₧ 12 znak∙ musφme zm∞nit hodnotu Seznamy[Okno1].èφ°ka ( v bodech, m∙₧e b²t aplikovßno i na v²b∞ry a menu).
A mφsto 2. NULL v definifi Okna1 napφÜeme Okno1PopUp. T∞∩ ovÜem musφme vytvo°it dalÜφ funkci Okno1PopUp. Do tΘ napφÜeme toto:
if(Seznamy[Okno1].V²b∞r==0) Objekty[Okno1].Text="Zm∞na"; else if(Seznamy[Okno1].V²b∞r==1) Objekty[Okno1].Text="Program1"; Obnovit=1;
K paramer∙m jakΘhokoliv objektu se dostaneme takto: Objekty[ID].parametr (viz 1.0 ┌vod). Kdy₧ zm∞nφme n∞ak² viditeln² parametr (ve v∞tÜin∞ p°φpad∙), tak za poslednφ zm∞nu napφÜeme Obnovit=1. Tφm zajistφme p°ekreslenφ.
Seznamy[Okno1].V²b∞r obsahuje Φφslo vybranΘ polo₧ky.
PopUp menu vyvolßme tak, ₧e stiskneme pravΘ tlaΦφtko myÜi a dr₧φme ho dokud si nevybereme polo₧ku.
Podobn²m zb∙sobem pracujeme takΘ s v²b∞rem a s menu, jen je mφsto prom∞nnΘ Seznamy prom∞nnß MenuVybSeznamy.
MenuVybSeznamy[Vyb1].V²b∞r
Existuje jeÜt∞ jedna mo₧nost prßce s udßlostmi, u kterΘ ovÜem nelze pou₧φvat PopUp menu. Funkce Udßlosti() vracφ ID objektu, u kterΘho prob∞hla jeho primßrnφ udßlost. To znamenß, ₧e v p°φpad∞ ₧e u₧ivatel spustφ PopUp menu vracφ funkce -1. Jednouduch² dialog v jednΘ funkci:
int DialogOkno,DialogTlAno,DialogTlNe,DialogText,udalost;
DialogOkno=Okno(220,210,200,70,"Varovßnφ",NULL,NULL); DialogText=Text(6,25,DialogOkno,NULL,NULL); DialogTlNe=TlaΦφtko(10,40,60,25,0,DialogOkno,"Ne",NULL,NULL); DialogTlAno=TlaΦφtko(130,40,60,25,0,DialogOkno,"Ano",NULL,NULL); while(udalost!=DialogTlNe && udalost!=DialogTlAno) { udalost=Udßlosti(); } if (udalost==DialogTlNe) { T≤n(100); ╚ekej(1000); VypniT≤n(); } else if (udalost==DialogTlAno) { T≤n(1000); ╚ekej(2000); VypniT≤n(); ZniΦOkno(DialogOkno); }
Prom∞nnΘ a konstanty ID"xyz" a Start"xyz" v globßlnφch definicφch m∞nφme pouze tehdy, chceme-li SOU╚ASN╠ zobrazit vφce objekt∙ jednoho druhu ne₧ je rozdφl konstanty Start"xyz" a Start"dalÜφobjekt". TakΘ musφme zm∞nit max. index v definici pole Objekty. Chceme-li zm∞nit nap°. poΦet p°epφnaΦ∙ musφme postupn∞ zmenit nastavenφ i dalÜφch kostant.
VDev je nßstroj pro visußlnφ vytvß°enφ grafickΘho prost°edφ. Pro vytvo°enφ objektu stiskneme v oblasti okna pravΘ tlaΦφtko myÜi a vybereme polo₧ku "Nov² objekt". Nynφ zvolφme druh objektu a stiskneme tlaΦφtko Ok. P°esuneme nov∞ vzniklΘ tlaΦφtko na mφsto, kterΘ chceme. Nynφ na n∞j m∙₧eme kliknout prav²m tlaΦφtkem myÜi a zvolit "Vlastnosti". Objevφ se okno se vÜemi dostupn²mi vlastnostmi tlaΦφtka. Takto postupujeme u ka₧dΘho objektu dokud nevytvo°φme cht∞nΘ okno. Pak mu₧eme zvolit v PopUp menu okna polo₧ku "Vygenerovat". Zadßme jmΘno souboru klikneme na Ok. V SGP Editoru potom tento soubor otev°eme a zkopφrujeme jeho obsah na zvolenΘ mφsto, pop°φpad∞ zkopφrujeme prom∞nnΘ do globßlnφch prom∞nn²ch.
Program jsem nejd°φve programoval v SGP Baltazarovi, ale m∞l jsem jin² zp∙sob ulo₧enφ vlastnostφ objekt∙ a zßhy jsem zjistil, ₧e tento zp∙sob je nepou₧iteln². Program m∞l b²t uveden u₧ na sout∞₧ BB 2001. Potom jsem ho zaΦal programovat v Pascalu ji₧ se zde pou₧it²m zp∙sobem uklßdßnφ vlastnostφ. Tento program stßle vyvφjφm, ale musφm °φct, ₧e verze pro Baltazara je PODSTATN╠ dokonalejÜφ. O letnφch prßzdninßch 2002 jsem zaΦal programovat verzi pro Baltazara a v²sledek prßce se dostavil na konci prßzdnin.
Mßte-li jakΘkoli p°ipomφnky nebo novΘ nßpady m∙₧ete je posφlat na e-mail: marek.brysa@post.cz Pokud budete m∙j program modifikovat, poÜlete mi ho prosφm na e-mail.