Image
23.6.2016 0 Comments

C++ pod Windows / Dialógy III / 11. časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

DOMÁCA ÚLOHA. Pozrime sa bližšie, ako sa mala riešiť domáca úloha z predchádzajúcej časti. Išlo o „manuálne“ vykonanie kontroly, či text v poli IDC_GETNAME nie je dlhší ako 15 znakov. Ak je dlhší, potom zobraziť používateľovi správu pomocou informačného dialógu, že text je dlhší, než aký môžeme kopírovať. Jediný problém, s ktorým ste sa mohli stretnúť, je, ako zistiť dĺžku reťazca v premennej m_editShowName. Nebolo to nič ťažké. Stačilo si uvedomiť, že táto premenná je premennou typu Cstring, a v helpe si pozrieť členské funkcie tejto triedy. Hľadanou funkciou na zistenie dĺžky reťazca je potom funkcia GetLength. Teraz to už bolo jednoduché. Ponúkam jednu z možných úprav funkcie OnCopy v zdrojovom súbore triedy dialógu Vymena. 

void CVymenaDialog::OnCopy()
{
      //skopírujeme dáta z ovládacích prvkov do premenných
      UpdateData(CTRL2VAR);
      // ak spĺňa podmienku...
      if ((m_editShowName.GetLength()) < 15)
      {
            //...skopírujeme dáta z premenných
            // do ovládacích prvkov
            m_editShowName=m_editGetName;
            UpdateData(VAR2CTRL);
      }
      else
            MessageBox("Zadaný text je dlhší ako 15 znakov", "Pozor!", MB_ICONWARNING);
}

VYTVÁRAME BIGDLG. Ako som sľúbil v predchádzajúcej časti, teraz si vytvoríme dialóg, do ktorého „napcháme“ takmer všetky štandardné ovládacie prvky, ktoré sa dajú. Spusťte AppWizard a vytvorte kostru aplikácie s názvom BigDlg. Postupujte ako v prípade aplikácie Vymena. Pre istotu si ešte pozrite výpis o novom projekte na obr. 1 a porovnajte ho s vaším. Teraz vytvorte nový zdroj dialógu (postup nájdete v predchádzajúcej časti). Jeho ID nemeňte, nechajte IDD_DIALOG1. Keďže plánujeme pridávať veľa ovládacích prvkov, zväčšite tento zdroj dialógu, aby mal rozmery približne 20 × 16 cm. Pravým tlačidlom vyvolajte jeho vlastnosti a do položky Caption na záložke General vpíšte: Štandardné ovládacie prvky, Jún 2001. Kliknite na záložku More Styles a nastavte vlastnosť Visible. Ak ste všetko urobili správne, mali by ste na obrazovke vidieť niečo také ako na obr. 2.

PRIDÁVAME OVLÁDACIE PRVKY. Teraz pridajte ovládacie prvky tak, ako ste ich pridávali v aplikácii Vymena. Umiestnenie a veľkosť každého ovládacieho prvku vidíte na obr. 3, čo je už kompletne hotový dialóg v aplikácii. Popis jednotlivých ovládacích prvkov je tu:

Obr. 1  Informácie o projekte BigDlg

Obr. 2 Situácia po vytvorení a pomenovaní nového dialógu

Obr. 3 Dialóg aplikácie BigDlg v „nasadení“

Opisy (Static Box) Meno, Dátum nar. a ďalšie: Tento ovládací prvok slúži len ako informácia, napr. aké informácie má zadať. Za behu aplikácie neprebieha žiadna interakcia medzi ovládacím prvkom popis a používateľom. Používateľ nemôže priamo meniť text napísaný v takomto ovládacom prvku. Postupne pridajte všetky tieto popisy do dialógu. Nemusíte každý prácne pridávať jeho vybraním z toolbaru Controls. Pochopiteľne, fungujú známe techniky Windows, keď stačí držať CTRL a ovládací prvok jednoducho skopírujete na nové miesto. Teraz stačí len pomeniť hlavičky (Caption) jednotlivých popisov a vybavené. Do hlavičky sa zvykne pred prvé písmeno vkladať znak & (ampersand), čo sa prejaví ako podčiarknutie prvého znaku v popise (nemusí to byť, samozrejme, pravidlom, môže sa vložiť pred ktorékoľvek písmeno, to bude pri behu podčiarknuté). Potom je možné pristupovať k ovládaciemu prvku hneď za popisom pomocou klávesu ALT plus príslušné písmeno. Napríklad na textové pole IDC_MENO sa môžeme jednoducho prepnúť stlačením klávesov ALT+M.

Textové pole (Edit Box) IDC_MENO: Textové pole je základným ovládacím prvkom na získavanie údajov od používateľa. Pole IDC_MENO umiestnite hneď vedľa popisu s hlavičkou Meno. Jeho ID zmeňte z IDC_EDIT1 na IDC_MENO. Ostatné nastavenia nechajte na default.  

Textové pole (Edit Box) IDC_RODC1: Je umiestnené za popisom Rodné číslo. Bude obsahovať len čísla (čo aj s pomocou Class Wizardu nastavíme) a bude to „dátumová“ časť rodného čísla. Zmeňte jeho ID na IDC_RODC1.

Textové pole (Edit Box) IDC_RODC2: Je umiestnené za popisom / a obsahuje posledné štvorčíslie rodného čísla. Jeho ID zmeňte na IDC_RODC2. Popisu s hlavičkou / nastavte vo vlastnostiach na záložke Styles vlastnosť Align Text na Center.

Textové pole (Edit Box) IDC_POZN: Je umiestnené za popisom s hlavičkou Poznámka a obsahuje krátky text. Je to viacriadkové textové pole, preto vo vlastnostiach tohto textového poľa označte v záložke Styles položku Multiline a odznačte položku Auto HScroll . Samozrejme, nezabudnite zmeniť jeho ID na IDC_POZN.

Rámček (Group Box) s hlavičkou Kategória: Nemá nijaký hlbší význam. Slúži len na vizuálne spojenie prepínačov. Do hlavičky (Caption) napíšte Kategória. ID nechajte default.

Prepínače (Radio Button) IDC_KATEGORY, IDC_RADIO2, IDC_RADIO3: Všetky tieto prepínače sú umiestnené vnútri rámčeka Kategória. Vrchnému nastavte vlastnosti, ako vidíte na obr. 4. Ďalším len zaškrtnite vlastnosť Tab Stop. Nechajte im implicitné ID a hlavičku (Caption) vypíšte podľa obr. 3. Nenastavujte už vlastnosť Group. Teraz Windows zabezpečí, že môže byť označený len jeden z týchto troch prepínačov.

Rámček Kategória nemá na ich správanie nijaký účinok. (Na korektné správanie sa prepínačov je dôležitá ešte vlastnosť Auto na karte Styles, ktorá je aj implicitne nastavená.)

Obr. 4 Vlastnosti prvého (vrchného) prepínača zručnosti

Obr. 5 Doplnenie položiek v Combo boxe

Obr. 6 Nastavenie vlastností bitmapy pre owner draw tlačidlo

Rámček (Group Box) Vlastník: Do hlavičky vpíšte text Vlastník a nastavte vlastnosť Group, čím ukončíte predchádzajúcu skupinu.

Zaškrtávacie políčka (Check Box) IDC_SPC, IDC_NOTEBOOK, IDC_APPLE: Tieto ovládacie prvky umiestnite do rámčeka Vlastník. Všetky vlastnosti nechajte implicitné, ibaže zmeňte ID a hlavičky, ako vidíte v tab. 1.

ID

Caption

IDC_SPC

Štandardné PC

IDC_NOTEBOOK

Notebook

IDC_APPLE

Apple

Tab. 1 ID a hlavičky ovládacích prvkov v rámčeku Vlastník

Pole so zoznamom (Combo Box) IDC_ZAMEST: Prvé pole so zoznamom bude tzv. simple. Používateľ môže do horného textového poľa napísať, čo chce, a potom vybrať položku z pripojeného zoznamu. Zmeňte ID tohto Combo boxu na IDC_ZAMEST a vo vlastnostiach na karte Styles položku Type nastavte na Simple. Počas návrhu aplikácie (tzv. Design time), môžeme do tohto poľa so zoznamom pridávať položky. Niekde, ako napr. v prípade zoznamu (List Box), to nejde a my môžeme pridávať položky až počas behu aplikácie (Run time). Ukážeme si to aj v aplikácii BigDlg. Keďže do poľa so zoznamom môžeme pridávať položky aj v Design time, vo vlastnostiach na záložke Data vpíšte hodnoty, ako vidíte na obr. 5. Na ďalší riadok sa dostanete stlačením CTRL + ENTER. Nezľaknite sa, keď po dopísaní a odklepnutí ENTER nič v poli so zoznamom neuvidíte. To, že položky boli naozaj do zoznamu pridané, si môžete overiť, ak spustíte dialóg v tzv. testovom móde, čiže stlačte CTRL + T alebo vyberte z menu Layout -> Test.

Pole so zoznamom (Combo Box) IDC_VZDELANIE: V tomto poli so zoznamom (tzv. Dropdown) nechajte všetky hodnoty tak, ako boli implicitne nastavené, len zmeňte ID na IDC_VZDELANIE. Na záložke Data pridajte úrovne vzdelania: Základné, Stredoškolské bez maturity, Stredoškolské + maturita, Vysokoškolské. V Combo boxe typu Dropdown môžete čokoľvek napísať do horného textového poľa alebo kliknutím na šípku vybrať nejakú položku zo zoznamu.

Pole so zoznamom (Combo Box) IDC_JAZYK: Posledné pole so zoznamom bude typu Drop List. V tomto type môže používateľ vyberať položky iba z pripojeného zoznamu. Nemôže písať vlastné hodnoty ako v typoch Drodown a Simple. Tento typ nastavte na záložke Styles podobne ako pri Combo Boxe IDC_ZAMEST. V záložke Data pridajte jazyky angličtinu, francúzštinu, španielčinu, nemčinu. ID zmeňte na IDC_JAZYK.

Zoznam (List Box) IDC_ZAMERANIE : V zozname môžete vybrať len jednu položku. Položky do zoznamu nemôžete pridávať počas Design time. Ako sa pridávajú, to si ukážeme ďalej v tejto časti. Zmeňte ID tohto zoznamu na IDC_ZAMERANIE, ostatné vlastnosti nechajte na default.

Posuvníky (Horizontal Scroll Bar) IDC_PROSPECH, IDC_ROCNIK: Pridajte dva horizontálne posuvníky a zmeňte ich ID. Posuvník naľavo bude mať ID: IDC_PROSPECH a posuvník napravo ID: IDC_ROCNIK. V Design time nemôžeme s posuvníkmi veľa robiť, všetko sa nastavuje až pri behu (Run time).

Popis (Static text) IDC_STATIC_ROCNIK : Umiestnite tento popis vedľa posuvníka IDC_ROCNIK. Nemeňte jeho hlavičku, zmeňte len jeho ID na IDC_STATIC_ROCNIK. Bude slúžiť na zobrazenie čísla ročníka podľa pozície posuvníka IDC_ROCNIK.

Tlačidlo (Button) IDC_FOTO a bitmapy “FOTOU“ a “FOTOD“: Funkciou tlačidla IDC_FOTO je zobraziť obrázok (bitmapu). Vo vlastnostiach tohto tlačidla nastavte v záložke General jeho ID na IDC_FOTO a Caption zmeňte na Foto. Na záložke Styles zaškrtnite položku Owner draw. Táto vlastnosť nám umožňuje riadiť zobrazovanie tohto ovládacieho prvku. Aby sme mohli nejakú bitmapu v našom dialógu zobraziť, musíme ju pridať ako zdroj. Pravým tlačidlom myši kliknite v zozname zdrojov na BigDlg Resources (pozri obr. 2). Vyberte položku Import... a nájdite na disku nejakú vhodnú bitmapu. Po pridaní bitmapy v zdrojoch pribudne jedna položka Bitmap, v ktorej (po otvorení) nájdete obrázok (zdroj) s názvom IDB_BITMAP1. Pravým kliknutím na IDB_BITMAP1 vyberte jej vlastnosti (properties). Do políčka ID napíšte “FOTOU“. Je dôležité, aby ID bolo v úvodzovkách (pozri obr. 6). Táto bitmapa sa zobrazí, ak bude tlačidlo v hornom stave (U – Up). Aby sme nejako odlíšili aj kliknutie na tlačidlo (dolný stav D – Down), pridajte do zdrojov ešte raz tú istú bitmapu, ale do ID napíšte “FOTOD“ a z menu Image vyberte Invert Colors (najbežnejší spôsob, ako rozlíšiť stavy: horný a dolný –  „stlačený“). Ďalšie stavy, ktoré môže tlačidlo nadobúdať a ktoré môžeme „ukázať“ pomocou bitmapy na tomto tlačidle, sú stav s fokusom (focused), vtedy by sme ID bitmapy nazvali “FOTOF“ a stav neprístupné (disabled), keď by ID bitmapy bolo “FOTOX“. Skúste si doma vytvoriť ďalšie bitmapy a vyskúšajte aj tieto stavy.

Tlačidlo (Button) IDC_BTNINF: Je to len pomocné tlačidlo, ktoré nemá inú funkciu ako informovať používateľa, že sa niekde v jeho okolí nachádza fotografia. Jeho ID zmeňte na IDC_BTNINF a do poľa Caption vo vlastnostiach na záložke General napíšte: Fotka. To je všetko.

Keď už máte všetky ovládacie prvky pridané, skontrolujte ešte ich poradie. Kombináciou CTRL + D alebo z menu Layout -> Tab Order zobrazíte ich poradie. Poradie meníte poklepaním na jednotlivé ovládacie prvky v tom poradí, aké chcete. Poradie pre náš príklad vidíte na obr. 7.  Ak sa pomýlite v poklepkávaní, stlačte CTRL a kliknite na ten ovládací prvok, ktorý má ako posledný správne číslo. Ďalšie kliknutia (už bez držania CTRL) budú číslovať ovládacie prvky od čísla posledného „dobrého“ ovládacieho prvku.

Obr. 7 Poradie ovládacích prvkov v dialógu aplikácie BigDlg

Obr. 8 Vytváranie novej triedy pre dialóg

 „PROGRAMOVANIE“ DIALÓGU. V prvom rade je potrebné vytvoriť triedu pre náš nový dialóg. Postupujte ako v prípade dialógu Vymena. Spusťte Class Wizard a na prvom dialógu Adding a Class, ktorý by sa vám mal zobraziť po spustení Class Wizardu (ten rozpoznal, že zdroj dialógu IDD_DIALOG1 nie je spojený so žiadnou existujúcou triedou) zvoľte Create a New Class a potvrďte. Objaví sa ďalší s názvom New Class, ktorý vyplňte podľa obr. 8.

Po vytvorení novej triedy sa vám zobrazí štandardné okno Class Wizardu. Teraz pridajte podľa tab. 2 členské premenné dialógu jednotlivým ovládacím prvkom (postup – pozri dialóg Vymena).

ID ovládacieho prvku

Členská premenná

Typ

IDC_MENO

m_strMeno

CString

IDC_RODC1

m_nRodc1

Int

IDC_RODC2

m_nRodc2

Int

IDC_POZN

m_strPozn

CString

IDC_KATEGORY

m_nCat

Int

IDC_SPC

m_bSpc

BOOL

IDC_NOTEBOOK

m_bNot

BOOL

IDC_APPLE

m_bApl

BOOL

IDC_ZAMEST

m_strZamest

CString

IDC_ZAMERANIE

m_strZam

CString

IDC_VZDELANIE

m_strVzd

CString

IDC_JAZYK

m_nJaz

Int

IDC_PROSPECH

m_nProsp

Int

IDC_ROCNIK

m_nRoc

Int

Tab. 2 Členské premenné dialógu

Posledné dve premenné (m_nProspm_nRoc) súvisia s posuvníkmi, s nimi budeme pracovať až v nasledujúcej časti. Pri premenných m_nRodc1m_nRodc2 nastavte minimálnu hodnotu na 0 a maximálnu v prípade m_nRodc1 na 999999 a v prípade m_nRodc2 na 9999. 

Ak ste už všetky premenné pridali, „namapujte“ pomocou Class Wizardu do triedy dialógu správu WM_INITDIALOG. Kliknite na Edit Code a pridajte kód na obsluhu tejto správy vo funkcii OnInitDialog.

BOOL CBigDialog::OnInitDialog()
{
      // získame ukazovateľ na ovládací prvok
      // IDC_ZAMERANIE
      CListBox* pLB=(CListBox*) GetDlgItem(IDC_ZAMERANIE);
 
      // pomocou ukazovateľa pLB pridáme do zoznamu
      // IDC_ZAMERANIE položky
      pLB->InsertString(-1, "Všeobecné");
      pLB->InsertString(-1, "Jazykové");
      pLB->InsertString(-1, "Humanitné");
      pLB->InsertString(-1, "Technické");
      pLB->InsertString(-1, "Prírodovedecké");
      pLB->InsertString(-1, "Elektrotechnické");
 
      // nahráme bitmapu na tlačidlo IDC_FOTO
      VERIFY(m_foto.AutoLoad(IDC_BUT, this));
     
      return CDialog::OnInitDialog(); 
}

Ako iste tušíte, tento kód pridá do zoznamu IDC_ZAMERANIE položky, čo bolo neuskutočniteľné v Design time. Rovnako pomocou funkcie AutoLoad nahráme na tlačidlo IDC_FOTO bitmapy “FOTOU“ a “FOTOD“. Na správnu funkciu je ešte potrebné zadeklarovať premennú m_foto. Pridajte do deklarácie triedy dialógu CBigDialog  (BigDialog.h) túto súkromnú členskú premennú:

CBitmapButton m_foto;

Teraz musíme pripojiť dialóg IDD_DIALOG1 k pohľadu. Otvorte zdrojový súbor triedy pohľadu (BigDlgView.cpp). Na začiatok pridajte jednu include direktívu na vloženie deklarácie triedy CBigDialog (bez nej by sme nemohli z pohľadu tento dialóg vyvolať).

#include "BigDialog.h"

Zmeňte funkciu OnDraw v tomto súbore, aby bolo používateľovi jasné, čo má s aplikáciou robiť:

void CBigDlgView::OnDraw(CDC* pDC)
{
      pDC->TextOut(0, 0, "Kliknite tu ľavým tlačidlom na vyvolanie dialógu. "); 
}

Predpokladám, že teraz je vám už jasné, čo bude nasledovať. Áno, bude to pridanie obsluhy správy WM_LBUTTONDOWN. Pridajte ju a zmeňte kód jej obslužnej funkcie, ako vidíte ďalej:

void CBigDlgView::OnLButtonDown(UINT nFlags, CPoint point)
{
      CBigDialog BigDlg;
 
      // naplníme premenné dialógu
      // "prvotnými" dátami
      BigDlg.m_strMeno="Janka Mrkvičková";
      BigDlg.m_nRodc1=722810;
      BigDlg.m_nRodc2=5437;
      BigDlg.m_strPozn="Študent dosahoval dobré výsledky v prírodných vedách.";
      // 0 - začiatočník; 1 - mierne pokročilí; 2 - Pokročilí
      BigDlg.m_nCat=1;
      BigDlg.m_bSpc=TRUE;
      BigDlg.m_bNot=TRUE;
      BigDlg.m_bApl=FALSE;
      BigDlg.m_strZam="Všeobecné";
      BigDlg.m_strZamest="Programátor";
      BigDlg.m_strVzd="Vysokoškolské";
      // 0 - Angličtina; 1 - Francúzština; 3 - Španielčina
      // 4 - Nemčina
      BigDlg.m_nJaz=3;
     
      // vyvoláme dialóg
      int ret=BigDlg.DoModal();
 
      TRACE("DoModal vratil: %d\n", ret);
}

FAQ

Q: Ako spustiť z mojej aplikácie inú, ktorá by potom bežala paralelne s mojou na pozadí?

A: Tento problém sa dá vyriešiť pomocou použitia procesov. Bez ďalšieho vysvetľovania (v seriáli sa k vláknam a procesom ešte dostaneme) si pozrite ilustračný kód:

// pomocou procesov spustíme prehliadač
DWORD    xxx;
STARTUPINFO si;
PROCESS_INFORMATION pi;
char* cmd;
BOOL navrat;
     
cmd="IEXPLORE.EXE c:\\Hry\\Strelec\\default.htm";
 
// spustí server
memset(&si,0,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.wShowWindow = SW_SHOW;
 
---CUT---
 
if (!CreateProcess(NULL, cmd ,NULL, NULL, TRUE,
  NORMAL_PRIORITY_CLASS, NULL, NULL, &si,
  &pi))
{
if (xxx = GetLastError()==2)
      {
            MessageBox("Chyba, nenájdený súbor", NULL, MB_OK);
      }
}
 
 
// zrušenie procesu a tým ukončenie IE
navrat = TerminateProcess(pi.hProcess,1);
// proces zrušený
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

Tento kód vyvolá proces (spustí Internet Explorer a natiahne v ňom stránku default.htm). Nakoniec proces ukončí a tým zavrie Internet Explorer. Nosná funkcia pri procesoch je CreateProcess, jej opisu sa budeme venovať neskôr. 

TIPY NA DOMA. Pohrajte sa s rôznymi nastaveniami vlastností jednotlivých ovládacích prvkov. Nemusíte presne vedieť, ktorá na čo slúži, ale aby ste mali aspoň akú-takú predstavu. Skúste zmeniť hlavičku owner draw tlačidla na inú ako Foto a program pri nahrávaní bitmapy na toto tlačidlo spadne. Prečo? (Návod: Pozri Help – funkciu AutoLoad a triedu CbitmapButton.) A keď zmeníte ID tlačidla owner draw na iné (pričom hlavičku necháte Foto), prečo program nespadne? (Samozrejme, musíte upraviť aj volanie funkcie AutoLoad, kde treba prepísať IDC_FOTO na vami zvolené ID tlačidla.) V helpe si pozrite, na čo slúži makro VERIFY. Pridajte funkčnosť pre tlačidlo IDC_BTNINF. Nech sa po kliknutí na toto tlačidlo zobrazí informačný dialóg s informáciou, že nad ním možno nájsť fotku (alebo s nejakou inou, to už je jedno, ide o to, ako to naprogramovať). A nakoniec pridajte do funkcie OnLButtonDown makrá TRACE tak, aby vždy po uzavretí dialógu vypísali do okna Debug hodnoty všetkých členských premenných dialógu.

Nabudúce. Zdá sa mi, že dialógy sa nám natiahnu ešte aspoň na dve časti. Nabudúce si dokončíme začaté rozprávanie (zapojíme posuvníky, odstránime zavretie dialógu po stlačení ENTER) a povieme si o spoločných ovládacích prvkoch systému Windows (Windows Common Controls). Po dialógoch nás čaká vytváranie menu, serializácia a iné dobrôtky spojené s dokumentmi. Teším sa na stretnutie o mesiac.

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á