Image
26.6.2016 0 Comments

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:

#include "SpolDlg.h"
 
Zmeňte kód vo funkcii OnDraw:
 
void CControlsView::OnDraw(CDC* pDC)
{
      pDC->TextOut(0, 0, "Kliknite tu ľavým tlačidlom na vyvolanie dialógu SpolDlg");
}
 
Pomocou Class Wizardu namapujte správu WM_LBUTTONDOWN  a zmeňte telo jej obslužnej funkcie:
 
void CControlsView::OnLButtonDown(UINT nFlags, CPoint point)
{
      CSpolDlg spolDlg;
 
      spolDlg.DoModal();
}

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:

void CSpolDlg::OnPlay()
{
      // otvoríme súbor s animáciou
      m_ctrlAnimate.Open("dillo.avi");
      // prehráme animáciu
      m_ctrlAnimate.Play(0,0xFFFF,1);
}

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_ROCNIKIDC_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_HSCROLLWM_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 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).

private:
      static int nSkok[10];

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:

BOOL CSpolDlg::OnInitDialog()
{
      CString strText;
      CSliderCtrl* pBezec=(CSliderCtrl*) GetDlgItem(IDC_BEZEC);
 
      pBezec->SetRange(0, 9);
      pBezec->SetPos(m_nBezec);
      strText.Format("%d", nSkok[pBezec->GetPos()]);
      SetDlgItemText(IDC_STATIC_BEZEC, strText);
     
      return CDialog::OnInitDialog();
}

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:

void CSpolDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
      // aby sa aktualizoval
      // popis pozície
      // inak sa OnHScroll nemusí volať
      CString strText;
      CSliderCtrl* pBezec=(CSliderCtrl*) GetDlgItem(IDC_BEZEC);
     
      strText.Format("%d", nSkok[pBezec->GetPos()]);
      SetDlgItemText(IDC_STATIC_BEZEC, strText);
}

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:

private:
      CImageList m_ZoznamObr;

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()).

BOOL CSpolDlg::OnInitDialog()
{
// ...
HICON hIkony[3];
 
      m_ZoznamObr.Create(32, 32, ILC_COLOR4, 3, 3);
     
      hIkony[0]=AfxGetApp()->LoadIcon(IDI_RED);
      hIkony[1]=AfxGetApp()->LoadIcon(IDI_GREEN);
      hIkony[2]=AfxGetApp()->LoadIcon(IDI_BLUE);
     
      for (int i=0; i<3; i++)
      {
            m_ZoznamObr.Add(hIkony[i]);
      }
           
      return 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: 

            CListCtrl* pList=(CListCtrl*) GetDlgItem(IDC_LIST1);
 
      pList->SetImageList(&m_ZoznamObr, LVSIL_SMALL);
     
      pList->InsertItem(0, "červená", 0);
      pList->InsertItem(1, "zelená", 1);
      pList->InsertItem(2, "modrá", 2);

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:

void CSpolDlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)
{
      CString strPolozka;
      int nVyber;
 
      NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
 
      CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST1);
      // iItem je členská premenná
      // štruktúry NM_LISTVIEW
      nVyber = pNMListView->iItem;
           
      strPolozka = pList->GetItemText(nVyber, 0);
      SetDlgItemText(IDC_STATIC_LIST, strPolozka);
 
      *pResult = 0;
}

Strom: Juj, ako som písal v úvode, musím sa krotiť .

CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(IDC_TREE1);
TV_INSERTSTRUCT tvinsert;
tvinsert.hParent = NULL;
tvinsert.hInsertAfter = TVI_LAST;
tvinsert.item.mask = TVIF_TEXT;
tvinsert.item.hItem = NULL;
tvinsert.item.state = 0;
tvinsert.item.stateMask = 0;
     
tvinsert.item.cChildren = 0;
tvinsert.item.lParam = 0;
     
tvinsert.item.pszText = "Otec";
HTREEITEM hOtec = pTree ->InsertItem(&tvinsert);
tvinsert.item.pszText = "Mama";
HTREEITEM hMama = pTree->InsertItem(&tvinsert);
 
tvinsert.hParent = hOtec;
tvinsert.item.pszText = "Dcéra_1";
pTree->InsertItem(&tvinsert);
tvinsert.item.pszText = "Syn_1";
pTree->InsertItem(&tvinsert);
 
tvinsert.hParent = hMama;
tvinsert.item.pszText = "Dcéra_2";
pTree->InsertItem(&tvinsert);
 
---CUT---
 
void CSpolDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
      NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
      CTreeCtrl* pTree = (CTreeCtrl*) GetDlgItem(IDC_TREE1);
      HTREEITEM hSelected = pNMTreeView->itemNew.hItem;
      if (hSelected != NULL)
{
            char text[15];
            TV_ITEM item;
            item.mask = TVIF_HANDLE | TVIF_TEXT;
            item.hItem = hSelected;
            item.pszText = text;
            item.cchTextMax = 30;
            VERIFY(pTree->GetItem(&item));
            SetDlgItemText(IDC_STATIC_TREE, text);
      }
      *pResult = 0;
}

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

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá