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.