GUI - Graphical User Interface Grafické Uživatelské Prostředí Obsah: Úvod - 1.0 Podrobný popis funkcí - 2.0 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 Události - 2.26 Příklady - 3.0 3.1 "Hello, World!" 3.2 PopUp Menu 3.3 Dialog Důležitá upuzornění a omezení 4.0 Práce s VDev 5.0 Závěr - 6.0 1.0 Úvod -------------------------------------------------------------------------------- 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;). 2.0 Podrobný popis funkcí -------------------------------------------------------------------------------- 2.1 void ZničOkno( int ID ) Zničí (vymaže ho z pole Objekty) okno s identifikačním číslem ID. Nastaví Obnovit na 1. 2.2 void PřesuňOkno( int x,y,ID ) Přesune okno s identifikačním číslem ID a všechny jemu náležící objekty na pozici x,y. 2.3 void Obnov( void ) Znovu postupně vykreslí všechny viditelné objekty. 2.4 void PřidejPoložku( int ID,string text ) Přidá položku s textem text do PopUp menu objektu s identifikačním číslem ID. 2.5 void MenuVýběrPřidejPoložku( int ID, string text ) Přidá položku s textem text do seznamu položek Výběru nebo Menu s identifikačním číslem ID. 2.6 int SpusťPopUpMenu( int x2,y2,ID ) Zobrazí PopUp menu objektu s identifikačním číslem ID na pozici x2,y2. Navrací číslo vybrané položky. 2.7 void _KresliMenu( int ID,z ) Nakreslí menu s identifikačním číslem ID. Pokud je z=1 nakreslí se ve zmáčlém stavu. 2.8 int SpusťMenu( int ID ) Zobrazí spuštěné Menu s identifikačním číslem ID. Navrací číslo vybrané položky. 2.9 int Menu( int x,y,okno,string text,void (*událost)(),void (*popup)() ) 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. 2.10 void _KresliVýběr( int ID,z ) Nakreslí výběr s identifikačním číslem ID. Pokud je z=1 nakreslí se ve zmáčklém stavu. 2.11 int SpusťVýběr( int ID ) Zobrazí spuštěný Výběr s identifikačním číslem ID. Navrací číslo vybrané položky. 2.12 int Výběr(int x,y,šířka,okno,string text,void (*událost)(),void (*popup)() ) 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. 2.13 void _KresliPřepínač( int ID ) Nakreslí přepínač s identifikačním číslem ID. 2.14 int Přepínač( int x,y,char stav,skupina,int okno,string text, void (*událost)(),void (*popup)() ) 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. 2.15 void _KresliVypínač( int ID ) Nakreslí vypínač s identifikačním číslem ID. 2.16 int Vypínač( int x,y,char stav,int okno,string text,void (*událost)(), void (*popup)() ) 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. 2.17 void _KresliTextovéPole( int ID ) Nakreslí vypínač s identifikačním číslem ID. 2.18 string UpravTextovéPole( int ID ) Spustí úpravu textového pole s identifikačním číslem ID. Navrací zadaný řetězec. 2.19 int TextovéPole(int x,y,šířka,styl,okno,string text,void (*událost)(), void (*popup)() ) 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. 2.20 void _KresliText( int ID ) Nakreslí vypínač s identifikačním číslem ID. 2.21 int Text( int x,y,okno, string text,void (*událost)(),void (*popup)() ) 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. 2.22 void _KresliTlačítko( int ID,z ) Nakreslí tlačítko s identifikačním číslem ID. Pokud je z=1 nakreslí se ve zmáčklém stavu. 2.23 int Tlačítko(int x,y,šířka,výška,styl,okno,string text,void (*událost)(), void (*popup)() ) 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. 2.24 void _KresliOkno( int ID,z ) 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. 2.25 int Okno( int x,y,šířka,výška,string text,void (*událost)(),void (*popup)() ) 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. 3.0 Příklady -------------------------------------------------------------------------------- 3.1 "Hello, World!" 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čí. 3.2 PopUp Menu 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 3.3 Dialog 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); } Důležitá upuzornění a omezení 4.0 -------------------------------------------------------------------------------- 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. Práce s VDev 5.0 -------------------------------------------------------------------------------- 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. Závěr 6.0 -------------------------------------------------------------------------------- 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.