Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Učíme se Win API - 12.
winapi_logo
27. března 2002, 00.00 | V tomto pokračování se naučíme vytvářet dialogová okna ve smyslu standardní třídy dialogových oken. Na tyto dialogy se v praxi běžně umísťují prvky jako ty, které jsme v minulém díle vytvářeli přímo na hlavním okně.
V minulých dílech jsme si ukázali na jednoduchém příkladě editačního pole a tlačítka, jak vytvořit tzv. Běžné prvky Windows na nějakém rodičovském okně, které pak přijímá zprávy od těchto prvků, týkající se především uživatelského vstupu. Ve standardních programech se většinou takovéto prvky umísťují na dialogová okna. Tímto výrazem mám na mysli dialogová okna v pravém slova smyslu, tedy nikoli okna chovající se jako dialog. Z hlediska Win API jsou totiž dialogy speciální třídou oken, mající některé specifické vlastnosti odlišující je od oken, jako je třeba hlavní okno naší aplikace. Jaké jsou tedy hlavní rozdíly? Pro vlastní dialogové okno neregistrujeme vlastní třídu. Dialogy totiž patří do třídy, která je již zaregistrovaná (podobně jako jsme tvořili edit-box a button). Mají také proceduru okna, která má stejné parametry jako "běžná" procedura okna, avšak její návratovou hodnotou v případě požadavku na výchozí zpracování zprávy není výsledek funkce DefWindowProc, jako u "klasického" okna, ale pouze vrátíme FALSE pokud se má zpráva zpracovat defautlně a TRUE, pokud je zpráva zpracovaná v aplikaci. Dále dialogové okno můžeme vytvořit jako modální nebo nemodální. Modální dialog běžně vytváříme (a zobrazujeme) funkcí DialogBox:
|
Pokud chceme vytvořit nemodální dialogové okno, použijeme funkci CreateDialog:
|
Tato funkce nám vrátí handle okna vytvořeného dialogu, které pak zobrazíme funkcí ShowWindow stejně jako "bežné" okno. Takový dialog je pak nemodální, to znamená, že bez jeho zavření můžeme pracovat s jiným oknem aplikace a opět se do dialogu vracet bez jeho opakovaného vytváření. V praxi ale většina dialogových oken bývá modální.
Nyní vyvstane otázka, jak se dialog ukončuje. Zde je rozdíl oproti běžnému oknu. Pokud bychom totiž v proceduře dialogu sami nezařídili jeho ukončení v reakci na nějaký podnět uživatele, okno dialogu se samo nezavře ani třeba po kliknutí na systémovou ikonku "zavřít". Musíme tedy alespoň na jednom místě použít funkci EndDialog:
|
Parametrem nResult určíme hodnotu, kterou pak dostaneme jako návratovou hodnotu funkce DialogBox, pokud jsme dialog vytvořili jako modální. Tímto způsobem pak můžeme rozlišit například zda uživatel ukončil dialog stisknutím tlačítka "OK" nebo "Storno". Vše si za chvilku ukážeme.
Posledním významným rozdílem mezi dialogem a běžným oknem je, že prvky na dialogu (edit, list-box, button atd.) se nevytvářejí (přesněji řečeno nemusí se takto vytvářet) programově tak, jak jsme to dělali na našem hlavním okně, ale jsou vytvořeny automaticky podle předpisu v skriptu zdroje (resource skript). Nic nám samozřejmě nebrání abychom po vytvoření dialogového okna stejným způsobem přidali další prvky (pomocí CreateWindowEx), ale v praxi se to nedělá, pokud k tomu není nějaký zvláštní důvod.
Ukažme si nyní vše na příkladě. V editoru zdrojů si vytvoříme dialog (zde nazvaný IDD_DIALOG1), zatím pouze s tlačítky "OK" a "Cancel", která mají identifikátory IDOK a IDCANCEL (které ve Visual C++ jsou takto nazvány defaultně). Dále si napíšeme následující (zatím tu nejjednodušší) proceduru dialogu:
|
Jak je vidět, zachytávání "příkazové" zprávy WM_COMMAND je stejné jako v případě bežného okna. V reakci na stisknutí jednoho z tlačítek pak dialog ukončíme zmíněnou funkcí EndDialog s předáním identifikátoru použitého tlačítka. Vlastní dialog pak vyvoláme (v proceduře hlavního okna) na výběr položky, kterou si přidáme do nabídky hlavního okna:
|
Zde je také vidět jak určíme z návratové hodnoty funkce DialogBox, jakým tlačítkem byl dialog ukončen. Pro úplnost ještě dodám, že stisknutí systémové ikonky "Zavřít" v dialogu vyvolá zprávu s identifikátorem IDCANCEL, proto je výhodné nechat identifikátor tlačítka "Storno" takto nazvaný abychom nemuseli testovat každý případ zvlášť.
Zde si můžete stáhnout ukázkový projekt: win_api_12.zip.
Obsah seriálu (více o seriálu):
- Učíme se Win API - motivační úvod
- Učíme se WinAPI - Začínáme
- Učíme se WinAPI - 3.
- Učíme se Win API - 4.
- Učíme se Win API - 5.
- Učíme se Win API - 6.
- Učíme se Win API - 7.
- Učíme se Win API - 8
- Učíme se Win API - 9.
- Učíme se Win API - 10.
- Učíme se Win API - 11.
- Učíme se Win API - 12.
- Učíme se Win API - 13.
- Učíme se Win API - 14.
- Učíme se Win API - 15.
- Učíme se Win API - 16.
- Učíme se Win API - 17.
- Učime se Win API - 18.
- Učime se Win API - 19.
- Učime se Win API - 20.
- Učime se Win API - 21.
- Učime se Win API - 22.
- Učime se Win API - 23.
- Učime se Win API - 24.
- Učíme se Win API - 25.
- Učíme se Win API - 26.
- Učíme se Win API - 27.
- Učíme se Win API - 28.
- Učíme se Win API - uživatelsky kreslený ListBox
- Učíme se Win API - uživatelsky kreslený ListBox II
- Dialog výběru složky a naplnění ListBoxu soubory
- Vyhledávání souborů - zjištění obsahu složky
- Pracujeme s ComboBoxem ve WinAPI
- Pracujeme s ComboBoxem II.
- Rozšířený prvek ComboBoxEx
- Ovládací prvek TrackBar
- Ovládací prvek Progress Bar
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007