
C++ pod Windows / Dialógy V. / 13. časť
Späť na úvod >> Späť na programovanie >> Späť na seriál
V úvode by som sa ešte rád vrátil k jedenástej časti. Nejako som sa vtedy nechal pri písaní „uniesť“, a preto bola táto časť pridlhá na to, aby sa celá zmestila do jedného čísla. Z toho dôvodu bol zdrojový kód k FAQ umiestnený na webe a z rovnakého dôvodu nebola v tejto časti uverejnená domáca úloha (i keď jej riešenie sa možno objavilo v dvanástej časti – neviem to určite, keďže v čase písania tejto časti ešte nevyšlo júlové číslo). OK, nabudúce sa budem „krotiť“, aby k podobným problémom už nedošlo. A ešte jedna poznámočka k jedenástej časti. Vo výpise funkcie OnInitDialog sa vyskytla chybička. Pri volaní funkcie AutoLoad mal byť jej prvým parametrom názov ovládacieho prvku nie IDC_BUT, ale IDC_FOTO (ako bolo uvedené v poznámke). Tento problém tiež súvisel s domácou úlohou (kde bol jeho presný opis), každopádne sa za túto chybu ospravedlňujem.
Obr. 1 Nová trieda pre dialóg
Windows Common Controls. Ovládacie prvky, ktoré sme doteraz preberali, by sa dali nazvať aj štandardné ovládacie prvky. Štandardné preto, lebo svojím spôsobom existovali už aj v starších verziách Windows (starších ako W95, resp. WNT 3.51). Ale keď prišli na trh „úžasné“ Windows 95 (a WNT 3.51), do rodiny ovládacích prvkov pribudli ďalší členovia. Väčšina z nich je len akýmsi rozšírením a doplnením tých štandardných, či už o grafiku, alebo o nové metódy. Netreba ich však považovať za nepotrebné, veľakrát môžu predstavovať to pravé, čo vašu aplikáciu – presnejšie dialógy v nej – sprehľadní a oživí. Všetky „spoločné“ ovládacie prvky Windows sú v tab. 1 spolu s prislúchajúcou triedou knižnice MFC a krátkym opisom. Ak ste sa s niektorými doteraz nestretli, pre lepšie pochopenie väčšinu ovládacích prvkov uvedených v tab. 1 si môžete pozrieť v helpe aj na obrázkoch, čo aspoň trochu zo začiatku pomôže.
Názov (slov.) |
Názov (angl.) |
Trieda MFC |
Opis |
Animácia |
Animate, Animation |
CanimateCtrl |
Zobrazí animáciu (AVI súbor). Môže ísť max. O dvojprúdový AVI súbor, neskomprimovaný, resp. Skomprimovaný cez kompresiu RLE8. Ak obsahuje zvuky, sú ignorované. |
Zobrazenie dátumu |
Time picker, Date and Time picker |
CdateTimeCtrl |
Umožní používateľovi zmeniť aktuálny dátum a čas v počítači. |
Rozšírené pole so zoznamom |
Extended Combo Box |
CcomboEx |
Ako klasické pole so zoznamom, ale môže zobraziť aj obrázky. |
Hlavička |
Header |
CheaderCtrl |
Tlačidlo, ktoré slúži ako hlavička, napríklad pre stĺpec. (Excel: označenie stĺpcov A1, A2) |
Klávesová skratka |
Hotkey |
ChotKeyCtrl |
Klávesová skratka. |
Zoznam obrázkov |
ImageList |
CimageList |
Zoznam obrázkov (s rovnakými rozmermi), ktoré môžu byť použité napr. v prehliadači stromových štruktúr (strome) alebo v prehliadači zoznamov. |
Prehliadač zoznamov |
List, List Control |
ClistCtrl |
Umožňuje v jednom okne zobraziť obrázok a k nemu aj text. (Rozšírenie klasického zoznamu) |
Kalendár |
Month Calendar |
CmonthCalCtrl |
Zobrazuje informácie o dátume. |
Indikátor priebehu |
Progress |
CprogressCtrl |
Zobrazuje priebeh nejakej operácie (napr. kopírovanie dát, priebeh inštalácie). |
Viacúčelová lišta |
ReBar |
CrebarCtrl |
Lišta, na ktorej môžeme zobraziť viacero ovládacích prvkov (v skutočnosti sú to „detské okná“ – child windows, v ktorých môžeme tieto ovládacie prvky zobraziť) napr. v IE horná lišta, kde môže byť textové pole s adresou, tlačidlá dopredu, dozadu a pod. |
Rozšírené textové pole |
RichEdit |
CrichEditCtrl |
Textové pole, podporujúce napr. formátovanie textu a vkladanie objektov OLE. |
Bežec |
Slider |
CsliderCtrl |
Niečo ako posuvník bez posúvacích šípok s možnosťou zobrazenia polohy. |
Číselník |
Spin, Spin button |
CspinButtonCtrl |
Dvojica šípok, obyčajne slúžiaca na pridávanie/uberanie z hodnoty. |
Stavový riadok |
Status Bar |
CstatusBarCtrl |
Okno zobrazujúce stavové „informácie“. |
Panel nástrojov |
ToolBar |
CtoolBarCtrl |
Okno zobrazujúce nástroje. |
List, Karta |
Tab |
CtabCtrl |
Používa sa v dialógoch so záložkami (listami, kartami), napr. nastavovanie vlastností pri ovládacích prvkoch (karta Styles, General atď.). |
Krátka nápoveď |
ToolTip |
CtoolTipCtrl |
Nápoveď napr. k niektorým tlačidlám z panela nástrojov. Obyčajne text vo farebnom okienku, ktorý sa zobrazí, ak kurzor dlhšie stojí na jednom mieste. |
Strom |
Tree, Tree Control |
CtreeCtrl |
Umožňuje zobrazovať text a obrázky v stromovom poradí (napr. rodokmeň a pod.). |
Tab. 1 Spoločné ovládacie prvky Windows (od W95)
Príklad. Keď už viete, ktoré sú spoločné ovládacie prvky a ako vyzerajú, uvedieme si krátky príklad, na ktorom si ukážeme „programovanie“ tých najrozšírenejších. Budú to: Animácia, Bežec, Zoznam obrázkov, Prehliadač zoznamov a Strom. Poďme na to! Vytvorte nový projekt s vlastnosťami, ako mal BigDlg (SDI a Finish). Nazvite ho jednoducho Controls. Vytvorte dialóg, jeho ID nechajte IDD_DIALOG1, hlavičku zmeňte na: Spoločné ovládacie prvky. Spusťte Class Wizard a pridajte novú triedu pre dialóg: CSpolDlg (obr. 2). Ešte urobte „štandardné“ operácie, do triedy pohľadu pridajte obsluhu správy WM_LBUTTONDOWN, v jej obslužnej funkcii vyvolajte dialóg, zmeňte funkciu OnDraw a „includujte“ hlavičkový súbor dialógu (všetko ako v prípade BigDlg). Čiže na začiatok zdrojového súboru triedy pohľadu pridajte jednu direktívu include:
Nebolo by zlé v tejto fáze program skompilovať a zlinkovať a zachytiť tak prvé chybičky.
Pridávanie ovládacích prvkov. Po týchto „prípravných“ prácach môžeme začať pridávať jednotlivé ovládacie prvky. Ešte azda uvediem, že každý z pridávaných ovládacích prvkov má oveľa viac funkcií a vlastností, ktorými ho môžeme ovládať, ako tie, ktoré si tu spomenieme. My tu však uvedieme len tie najzákladnejšie, dôležité pri „klasickom“ používaní daného prvku. Ďalšie informácie získate ľahko v helpe. Umiestnenie jednotlivých ovládacích prvkov vidíte na obr. 3. Už nebudem podrobne rozpisovať pridávanie vysvetľujúcich popisov k ovládacím prvkom, pri nich stačí vždy zmeniť len hlavičku (Animácia, Bežec atď.).
Obr. 2 Dialóg v „nasadení“
Animácia: Aj keď sa to nezdá, animácia sa v programoch vyskytuje dosť často (napr. animované logo firmy, zobrazenie kopírovania súborov). Preto si prácu s ňou opíšeme. Podľa obr. 7 z desiatej časti vyberte ovládací prvok animácia (ID nechajte default) a pridajte ho na dialóg, pričom vytvorte štvorec s rozmermi približne 50 × 40 (podľa rozmeru v pravej dolnej časti stavového riadka VC++). Pod to umiestnite tlačidlo, ktoré bude slúžiť na spustenie animácie. ID tlačidla zvoľte IDC_PLAY a hlavičku: Spusti. Aby sme nejako mohli pristupovať k tomuto ovládaciemu prvku (animácii), musíme ešte vytvoriť premennú, ktorá mu bude priradená (bude jeho členskou premennou). Spusťte Class Wizard, v poli so zoznamom Class Name vyberte CSpolDlg, kliknite na kartu Member Variables, v zozname vyberte IDC_ANIMATE a kliknite na Add Variable. Dialóg vyplňte podľa obr. 4.
Obr. 3 Členská premenná dialógu priradená ovládaciemu prvku IDC_ANIMATE
Keď už ste v Class Wizarde, kliknite späť na kartu Message Maps a v rovnakej triede pridajte tlačidlu IDC_PLAY obsluhu správy BN_CLICKED a kliknite na Edit Code. Pridajte kód do tejto funkcie, ako vidíte tu:
Toto riešenie predpokladá, že v adresári projektu máte súbor dillo.avi. (je dostupný na MSDN Library CD 1 ako súbor v projekte Cmnctrl1). Ak nemáte tento súbor, použite iný, musí však spĺňať podmienky uvedené v tab. 1 (podrobne viď. help). Skúste si na domácu úlohu pridať tento súbor do zdrojov (nový zdroj nazvite, ako chcete) a potom zmeňte volanie funkcie Open. Je to jednoduché.
Bežec: Zabudnite na posuvníky! Ak budete chcieť urobiť niečo také, čo robili v BigDlg posuvníky IDC_ROCNIK a IDC_PROSPECH, knižnica MFC vám ponúka lepšie riešenie. Je ním bežec (slider), ktorý je ľahšie „programovateľný“ ako posuvníky. Pre jeho „spojazdnenie“ dokonca nemusíte mapovať správy WM_HSCROLL a WM_VSCROLL (ak teda nechcete zobrazovať pozíciu bežca). My si naprogramujeme bežec, ktorý sa bude pohybovať po „skokoch“, ktoré mu my určíme, a svoju pozíciu nám bude ukazovať rovnako ako pri posuvníkoch, plus jeho relatívnu pozíciu budeme vidieť aj na ňom samotnom (tzv. Ticks). Pridajte pod tlačidlo IDC_PLAY jeden posuvník a hneď vedľa (napravo) jeden popis (na ukázanie hodnoty, ktorej zodpovedá aktuálna pozícia bežca). Do ID bežca napíšte IDC_BEZEC, na karte Styles zaškrtnite vlastnosti Tick marks a Auto ticks. ID popisu zmeňte na IDC_STATIC_BEZEC.
Pomocou Class Wizardu pridajte členskú premennú pre ovládací prvok Bezec, ktorá je typu integer, a nazvite ju m_nBezec(podobne ako pri animácii). Bude predstavovať pozíciu bežca. Keďže chceme, aby sa bežec pohyboval po nami určených skokoch (dajme tomu, že ich bude 10), pridajte (už nie pomocou Class Wizardu) ešte do tohto súboru súkromné statické (to je dôležité) pole nSkok premenných typu integer (samotné „skoky“ nastavíme až v zdrojovom súbore).
Tým by boli úpravy hlavičkového súboru dokončené. Ideme do zdrojového súboru dialógu. Na začiatok (za direktívy preprocesora) naplňte pole určujúce bežcove „skoky“. Napríklad takto:
int nSkok[10]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
Podobne ako pri posuvníkoch aj tu musíme zadeklarovať ukazovateľ na tento ovládací prvok a nastaviť rozsah. Opäť využijeme funkciu OnInitDialog, ktorá je na to najvhodnejšia. Zmeňte jej telo takto:
Aby sme v popise vedľa bežca videli jeho presnú pozíciu, musíme namapovať obsluhu správy WM_HSCROLL a zmeniť jej obslužnú funkciu takto:
Zoznam obrázkov: Zoznam obrázkov sám osebe veľkú funkciu neplní, jeho „sila“ a „užitočnosť“ sa prejaví až v spojení s prehliadačom zoznamov a stromom. Do prehliadača obrázkov vkladáme ikony. Tieto ikony „ťaháme“ buď zo zdrojov (podľa ID), alebo priamo z disku (pozri vyššie dillo.avi) (podľa mena). My využijeme prvý spôsob. Vložte do zdrojov tri nové ikony (v Resources pravým tlačidlom na Icon a Insert Icon). Ak máte nejaké vhodné na disku, môžete ich pokojne importovať. Ak nepatríte medzi graficky zdatných alebo sa vám nechce kresliť nejaké perfektné ikony, vytvorte tri rozdielne ikony jednoducho tak, že každú vyplníte inou farbou. Pre jednoduchosť zvoľte „klasické“ výplne Red, Green, Blue a podľa toho nazvite aj ID týchto ikon: IDI_RED, IDI_GREEN, IDI_BLUE. Teraz máme tri ikony – červenú, zelenú a modrú – v tvare štvorca. Keď máme ikony, musíme ich ešte nejako „naprogramovať“. Pridajte jednu súkromnú premennú typu Zoznam obrázkov do triedy dialógu:
Teraz dopíšte tento kód do funkcie OnInitDialog (pod volanie funkcie SetDlgItemText (alebo pred, ak chcete), podmienkou je, aby ste kód pridali pred volanie funkcie CDialog::OnInitDialog()).
Tým je zoznam obrázkov dokončený.
Prehliadač zoznamov: Ako sme povedali, zoznam obrázkov využijeme až v spojení s prehliadačom zoznamov, prípadne stromom. Pridajte do dialógu podľa obr. 3 jeden prehliadač zoznamov (ListControl). Jeho vlastnosti nastavte, ako vidíte na obr. 5. ID nechajte na default: IDC_LIST1. Aby sme mohli sledovať, akú položku máme označenú, pridajte pod prehliadač aj jeden popis. Do jeho ID napíšte: IDC_STATIC_LIST a vymažte text z jeho Caption.
Obr. 4 Vlastnosti prehliadača zoznamov
Pre prepojenie prehliadača zoznamov so zoznamom obrázkov pridajte ešte tento kód do funkcie OnInitDialog:
Pre obmenu textu v popise podľa vybranej položky zo zoznamu je potrebné pomocou Class Wizardu namapovať správu prehliadača zoznamov: LVN_ITEMCHANGED. Jej kód upravte takto:
Strom: Juj, ako som písal v úvode, musím sa krotiť .
Domáca úloha. Doma si skúste naprogramovať aj iné spoločné ovládacie prvky (číselník, kalendár) a vyskúšajte si ich rôzne nastavenia a vlastnosti. Skúste si sami (bez informácií z našej webovej stránky) naprogramovať strom len s pomocou helpu. Aj keď budete možno neúspešní, veľa sa naučíte! Vytvorte si lepší zoznam obrázkov, ktorý použite namiesto tu vytvoreného v prehliadači zoznamov a pripojte ho aj k stromu.
Nabudúce. O mesiac nemodálnymi dialógmi definitívne skončíme túto tému (veď už bolo načase) a povieme si niečo o tvorbe menu.
Zobrazit Galériu