3.18. Změna textu tlačítek a přepínačů
Každý zatím popisovaný kontrolní prvek formuláře obsahuje text, který je uveden v rámečku tlačítka či přepínače nebo vedle políčka k zaškrtnutí. Zobrazený text je definován v souboru prostředků aplikace.
Ve struktuře ControlPtr, ve které jsou uložena data kontrolních prvků formuláře, je uložen pouze ukazatel na tento text. Hodnotu ukazatele na text tlačítka, políčka pro výběr textu nebo jiného kontrolního prvku formuláře můžeme zjistit pomocí funkce CtlGetLabel().
const Char *CtlGetLabel(const ControlType *control) Vrátí ukazatel na text kontrolního prvku formuláře. | |
Vstupní parametry |
|
Vrácená hodnota |
|
Text zobrazený v kontrolních prvcích formuláře je možné měnit pomocí funkce CtlSetLabel(). Situaci nám komplikuje, že nastavujeme pouze ukazatel na text. Text samotný musíme mít uložený v paměti v samostatné řetězcové proměnné a funkci CtlSetLabel() předávat jen ukazatel na něj.
void CtlSetLabel(ControlType *control, const Char *text) Nastaví nový ukazatel popisku kontrolního prvku formuláře. | |
Vstupní parametry |
|
Je-li to zapotřebí, tak funkce CtlSetLabel() překreslí prvek formuláře na displeji. Použití této funkce ilustruje následující kód, ve kterém používáme opět funkci Objekt(), kterou jsme definovali v dílu 3.8:
// Nesmíme zapomenout mít text tlačítka uložený v // globální proměnné nebo v bloku paměti, a to // pro každé tlačítko zvlášť Char gTextTlacitkaJedna[30]; Char gTextTlacitkaDve[30]; void NastavTextTlacitkaJedna(Char* text) { StrCopy(gTextTlacitkaJedna, text); CtlSetLabel((ControlPtr)Object(TlacitkoJedna), gTextTlacitkaJedna); } void NastavTextTlacitkaDve(Char* text) { StrCopy(gTextTlacitkaDve, text); CtlSetLabel((ControlPtr)Object(TlacitkoDve), gTextTlacitkaDve); } // ... |
Předchozí příklad měl za úkol ilustrovat základní problém při nastavování textu tlačítek: Pro každé tlačítko, jehož text měníme, musíme definovat pomocnou proměnnou, ve které bude text tlačítka uložen.
Později v této kapitole si uvedeme ještě další způsoby, jak ošetřit změnu textu tlačítka nebo přepínače.
3.19. Skrývání, odkrývání a překreslování kontrolních prvků formuláře
Pro skrývání a odkrývání kontrolních prvků formuláře můžeme použít hned čtyři funkce, jejichž vlastnosti jsou shrnuty v následující tabulce:
Vymaže kontrolní prvek z displeje (prázdné místo vyplní barvou pozadí) | Vykreslí kontrolní prvek na displeji | |
---|---|---|
Změní pouze obsah displeje | CtlEraseControl() | CtlDrawControl() |
Změní obsah displeje a upraví reakci na dotek perem | CtlHideControl() | CtlShowControl() |
Funkce CtlDrawControl() a CtlEraseControl() pouze aktualizují obsah displeje. Při použití těchto funkcí se nemění ostatní vlastnosti kontrolního prvku - pokud funkcí CtlEraseControl() vymažeme tlačítko z displeje, tak se sice prvek z displeje vymaže, ale prázdné místo bude stále reagovat na dotek pera uživatele.
Také funkce CtlShowControl() a CtlHideControl() vykreslí (nebo smažou) prvek formuláře. Mimo to však nastaví také příslušný atribut datové struktury ControlType tak, aby tlačítko začalo (nebo přestalo) odpovídat na dotyk perem. Pokud tedy vymažeme tlačítko z displeje funkcí CtlHideControl(), tak se nejen vymaže z displeje, ale přestane i reagovat na akce uživatele.
void CtlDrawControl(ControlType *control) void CtlEraseControl(ControlType *control) void CtlShowControl(ControlType *control) void CtlHideControl(ControlType *control) Smaže nebo vykreslí kontrolní prvek formuláře na displeji. | |
Vstupní parametry |
|
Chceme-li kontrolní prvek formuláře překreslit, zavoláme bezprostředně po sobě funkce CtlEraseControl() a CtlDrawControl(). První z nich vyplní oblast, kterou prvek zabíral, barvou pozadí a druhá funkce jej vykreslí na displeji. Pokud bychom prvek před vykreslením nesmazali, nakreslil by se nově vykreslovaný prvek přes ten starý.
Alternativní způsob změny textu tlačítek
Pokud na začátku programu nastavíme funkcí CtlSetLabel() novou adresu textu tlačítka a později tento text změníme, bude obsah displeje aktualizován až po překreslení tlačítka. Vhodným místem pro nastavení ukazatele na text tlačítek je zpracování zprávy frmOpenEvent ve funkci formuláře.
Touto metodou je možné ušetřit paměť při změnách textu tlačítka na místě. V našem programu využijeme právě tento způsob; v následujícím rámečku je celá metoda shrnuta:
// Text jednoho prepinace s cislem Char gTextPrepinace[2] = "0"; Boolean UdalostHlavnihoFormulare(EventPtr udalost) { switch(udalost->eType) { case frmOpenEvent: // Promenna gTextPrepinace bude po zavolani nasledujici // funkce obsahovat text tlacitka PrepinacJedna (neboli // v tlacitku PrepinacJedna bude pote vzdy zobrazen text // ulozeny v promenne gTextPrepinace). CtlSetLabel((ControlPtr)Objekt(PrepinacJedna), gTextPrepinace); return true; ... } // Chceme-li zmenit cislo v prepinaci, tak nejprve zmenime // obsah promenne, ktera obsahuje text prepinace a pote // jej jednoduse prekreslime. void ZmenCisloVPrepinaci(UInt16 cislo) { gTextPrepinace[0] = '0' + (cislo % 10); CtlEraseControl((ControlPtr)Objekt(PrepinacJedna)); CtlDrawControl((ControlPtr)Objekt(PrepinacJedna)); } |
V přepínači je zobrazena pouze jedna číslice, která je uložena v globální proměnné. Ve funkci formuláře nastavíme ukazatel na text tlačítka tak, aby ukazoval na tuto globální proměnnou. Pak kdykoliv
- změníme obsah globální proměnné
- překreslíme tlačítko (voláním CtlEraseControl() a CtlDrawControl()),
tak se bude měnit i obsah displeje - přesně podle našeho záměru.
Teď již známe všechny funkce, které budeme potřebovat při psaní našeho programu. V příštím dílu doplníme program o schopnost nastavování výšky matky a otce.