Hlavní navigace

Knihovna ClanLib (12)

Petr Kavánek 2. 8. 2004

Dnes se po vsuvce z minula (zaměřené na ukázkovou hru) vrátíme k tvorbě GUI, čímž navážeme na předminulý díl seriálu. Budeme pokračovat popisem vlastností a možností nastavení jednotlivých komponent (tlačítek, listboxů). Konkrétně se zaměříme zejména na třídu CL_Component, která je základní třídou pro ostatní komponenty.

Metody a signály třídy CL_Component

Jak jste již mohli postřehnout z předminulého dílu, je CL_Component základní třídou, ze které jsou všechny třídy reprezentující konkrétní komponenty odvozeny. Jako taková tedy poskytuje základní rozhraní společné pro všechny komponenty. Pokud se podíváte na její hlavičku, která by se měla nacházet v souboru component.h, zjistíte, že nabízených metod a signálů je opravdu mnoho a samotný jejich výčet by zabral několik stran.

Pokusím se zmínit několik nejdůležitějších. Budete-li si někdy říkat, že by se vám hodila vlastnost, která v tomto výčtu není, nezoufejte a podívejte se do zmíněného hlavičkového souboru, myslím, že budete mít slušnou šanci ji tam najít.

CL_GUIManager* get_gui_manager() const;

Metoda get_gui_manager() vrací ukazatel na GUIManager, se kterým je příslušná komponenta spojena, případně nulový ukazatel, pokud žádný takový GUIManager neexistuje.

void set_gui_manager(CL_GUIManager *gui);

Můžeme vytvořit nové propojení komponenty s GUIManagerem metodou set_gui_manager(), které předáme ukazatel na příslušný GUIManager.

int get_width() const;
int get_height() const;

Metody, pomocí nichž jsme schopni zjistit rozměry komponenty.

void set_size(int new_width, int new_height);
void set_width(int width);
void set_height(int height);

Rozměry můžeme také nastavit metodou set_size(), nebo šířku a výšku zvlášť pomocí set_width() a set_height().

const CL_Rect& get_position() const;

Metoda get_position() vrací pozici komponenty jako CL_Rect.

void set_position(const CL_Rect &new_pos);
void set_position(int new_x, int new_y);

Pomocí set_position() můžeme nastavit novou pozici.

const std::list<CL_Component *>& get_children() const;

Pomocí get_children() získáme seznam (std::list) všech komponent, které jsou v této obsaženy (typicky využijeme například u okna).

bool has_focus() const;

Metoda has_focus() odpoví, zda má příslušná komponenta právě zaměření. Zaměření může mít v daný okamžik vždy maximálně jedna komponenta (té jsou pak například předávány události klávesnice na rozdíl od nezaměřených komponent).

void set_focus();

Díky set_focus() jsme schopni komponentu zaměřit.

bool has_mouse_over() const;

Odpoví, zda je nad komponenou zrovna kurzor myši.

bool is_visible(bool check_parents = true) const;
bool is_enabled(bool check_parents = true) const;

Těmito metodami jsme schopni zjistit, jestli je daná komponenta viditelná resp. zapnutá (tj. reaguje na uživatelský vstup a výstup).

void show(bool show = true);
void enable(bool enable = true);

Metodou show() nastavíme viditelnost. Pomocí enable() komponentu zapneme, případně vypneme.

void run();
void quit();

Pomocí run() můžeme nechat běžet samotnou komponentu v její vlastní smyčce, což je podobné, jako když necháme běžet ve vlastní smyčce celé GUI, jak již bylo popsáno. Rozdíl je, že zde se obnovuje pouze tato komponenta (příp. děti). Využití je pak možné, například pokud chceme pozastavit běh programu, dokud uživatel nezmáčkne OK v nějakém dialogu (například by se tak dala udělat celkem jednoduše pauza ve hře). Po zmáčknutí OK nám pak stačí v metodě vyvolané signálem stisknutí OK zavolat pouze příslušné quit() pro tuto naši komponentu a program se rozběhne dál.

void close();

Metoda close() příslušnou komponentu zruší.

CL_Signal_v0 &sig_begin_paint();
CL_Signal_v0 &sig_paint();
CL_Signal_v0 &sig_end_paint();

Signál sig_begin_paint() je vysílán vždy na začátku vykreslování komponenty.

Signál sig_end_paint() je vysílán vždy na konci vykreslování komponenty.

Signál sig_paint() je vyslán někde mezi předchozími dvěma.

CL_Signal_v1<const CL_InputEvent &> &sig_input_down();
CL_Signal_v1<const CL_InputEvent &> &sig_input_up();

Tyto signály jsou vyslány, je-li stisknuto resp. uvolněno tlačítko některého ze vstupních zařízení, např. klávesnice nebo myši.

CL_Signal_v1<const CL_InputEvent &> &sig_key_down();
CL_Signal_v1<const CL_InputEvent &> &sig_key_up();

CL_Signal_v1<const CL_InputEvent &> &sig_mouse_down();
CL_Signal_v1<const CL_InputEvent &> &sig_mouse_up();
CL_Signal_v1<const CL_InputEvent &> &sig_mouse_move();

Obdoba předchozích dvou signálů vyslaná pouze v případě, že se jedná o tlačítko klávesnice resp. myši. Navíc sig_mouse_move() je vyslán při pohybu myší.

CL_Signal_v0 &sig_mouse_enter();
CL_Signal_v0 &sig_mouse_leave();

Signály vyslané v okamžiku, když kurzor myši vstupuje (enter) nad plochu komponenty, respektive když ji opouští (leave).

CL_Signal_v0 &sig_got_focus();
CL_Signal_v0 &sig_lost_focus();

Signály vyslané při získání resp. ztrátě zaměření.

CL_Signal_v0 &sig_close();

Signál vyslaný při zavření komponenty (tj. například při kliknutí na křížek u okna).

CL_Signal_v2<int, int> &sig_resize();

Signál vyslaný při změně rozměrů. Dva parametry typu int jsou staré rozměry.

CL_Signal_v2<int, int> &sig_move();

Signál vyslaný při změně souřadnic. Parametry jsou staré souřadnice.

Závěrem

Tímto jsme si popsali základní rozhraní třídy CL_Component, které můžeme využít při práci s kteroukoliv konkrétní komponentou.

Příště si ještě povíme, které společné vlastnosti komponent je možné nastavit v GDF, a poté se již budeme věnovat specifikám, kterými se jednotlivé komponenty liší.

Našli jste v článku chybu?
Podnikatel.cz: Nejenom EET, začaly platit další zákony

Nejenom EET, začaly platit další zákony

DigiZone.cz: ČRa DVB-T2 ověřeno má i Sharp

ČRa DVB-T2 ověřeno má i Sharp

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: ČRa DVB-T2 ověřeno: Hisense a Sencor

ČRa DVB-T2 ověřeno: Hisense a Sencor

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: Manželka je bio, ale na sex moc není

Manželka je bio, ale na sex moc není

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Vitalia.cz: Tesco: Chudá rodina si koupí levné polské kuře

Tesco: Chudá rodina si koupí levné polské kuře

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka