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 - 13.
winapi_logo
2. dubna 2002, 00.00 | V tomto pokračování se začneme zabývat prací s běžnými dialogovými prvky. Bude se jednat o edit, check-box, static a button. Naučíme se detekovat akce uživatele na těchto prvcích a reagovat na ně.
V předchozím článku jsme si ukázali, jak vytvořit ten nejjednodušší dialog, založený na standardní třídě dialogových oken. Umíme už zjistit, jakým způsobem uživatel dialog ukončil, tedy v typickém případě rozlišit stick "OK" a "Storno". V tomto pokračování se začneme zabývat prací s běžnými dialogovými prvky.
Jedním ze specifických rysů dialogového okna je, že prvky na něm umístěné definujeme ve skriptu zdrojů a nemusíme je vytvářet "ručně" pomocí CreateWindowEx. Výhodou je kromě zjednodušení kódu snadná práce s rozmístěním prvků na dialogu (pokud samozřejmě používáme nějaký vizuální editor zdrojů).
Začneme tím, že si na dialog umístíme jedno editační pole (IDC_EDIT1), tlačítko (IDC_ZOBRAZ_TEXT), prvek Static text (IDC_KOPIE) a check-box (IDC_SLEDOVAT). Identifikátory prvků uvedené v závorkách si samozřejmě můžete zvolit podle svého, pak budete muset upravit i zdrojový kód. Cílem v této fázi bude naučit se jak získat text obsahu edit-boxu, jak zjistit okamžitý stav zaškrtnutí check-boxu a jak zachytit událost, kdy dojde ke změně obsahu edit-boxu, tedy když uživatel zapíše či smaže znak. Řekněme, že budeme chtít po stisknutí tlačítka přenést aktuální obsah edit-boxu do titulku hlavního okna aplikace. Tím se také přesvědčíme o tom, že i když je otevřen modální dialog, další okna aplikace mohou běžně přijímat zprávy a reagovat na ně, i když pro uživatele jsou v té době nedostupná.
V proceduře dialogu již máme handler zprávy WM_COMMAND, kde zachytáváme stisk tlačítek "OK" a "Storno". Přidejme tedy do handleru WM_COMMAND následující case:
|
To je vše co musíme udělat pro přenesení textu edit-boxu do titulku hlavního okna. Jak je vidět, pro získání textu prvku na dialogu můžeme použít funkci GetDlgItemText:
|
Samozřejmě bychom mohli použít již dříve uvedenou funkci GetWindowText. Pak bychom ale museli získat handle (HWND) prvku (edit-boxu). K získání handle kteréhokoli prvku na dialogu slouží funkce GetDlgItem:
|
Řekněme si ještě o funkci, která nám vrátí číselnou hodnotu (pokud ji lze převést) obsahu prvku dialogu. U edit-boxu je možné a výhodné pro tento případ nastavit v editoru zdrojů vlastnost "Number" odpovídající stylu okna ES_NUMBER. Příslušnou funkcí je pak GetDlgItemInt:
|
Tato funkce nám vrátí číselnou hodnotu obsahu prvku, pokud má obsah číselný smysl. Úspěšnost převodu je uložena do parametru lpTranslated.
Dále si řekneme, jak zjistíme v požadovaném okamžiku stav zaškrtnutí check-boxu. Zde zjistíme, že jednou z nejčastěji používaných funkcí je SendMessage, tedy funkce která pošle zvolenému oknu zprávu, která může sloužit k "ovládání" okna, tedy například nastavení textu, přidání řádku do list-boxu a stovky podobných. Kromě toho tato funkce vrací výsledek zpracování zprávy v příslušném okně. Mnoho zpráv je totiž dotazovacích, kterými požadujeme od cílového okna nějakou informaci, například právě stav zaškrtnutí check-boxu. V dialogových oknem můžeme místo SendMessage použít funkci SendDlgItemMessage:
|
V této funkci nemusíme uvádět handle okna, ale místi toho identifikátor prvku dialogu a systém si handle zjistí sám. Je to obdobná jako u vztahu funkcí GetWindowText a GetDlgItemText.
V případě zjištení stavu check-boxu použijeme zprávu BM_GETCHECK. Identifikátor zprávy začíná na "BM", což je ze slov "button message". Znamená to, že check-box je prvek třídy "BUTTON". Návratová hodnota zprávy (tedy to co nám vrátí funkce SendMessage nebo SendDlgItemMessage) pak může být jednou ze 3 hodnot:
- BST_CHECKED - check-box je zaškrtnut
- BST_UNCHECKED - check-box není zaškrtnutý
- BST_INDETERMINATE - check-box je "zašedlý", tedy v neurčitém stavu
V této souvislosti si řekněme o "opačné" zprávě, tedy nastavení stavu check-boxu programově. Tou zprávou je BM_SETCHECK, a v parametru wParam zprávy SendDlgItemMessage uvedeme jeden z výše uvedených stavů, do kterého chceme check-box nastavit. Toto počáteční nastavení se obvykle realizuje v handleru zprávy WM_INITDIALOG, kterou obdržíme pouze jednou "na začátku" po vytvoření dialogového okna, těsně před tím, než je dialog zobrazen.
Nakonec si ukážeme, jak sledovat jakékoli změny v obsahu editačního pole. V tomto případě je posílána tzv. oznamovací (notifikační) zpráva EN_CHANGE. Tato a další oznamovací zprávy nejsou ve skutečnosti samostatnými zprávami, ale jsou posílány jako horní WORD parametru wParam zprávy WM_COMMAND. Vše si ukážeme na příkladě, ve kterém budeme změny v editačním poli "kopírovat" do prvku "static text", tedy při každé zachycení změny obsahu editu (IDC_EDIT1), zjistíme jeho obsah a ten nastavíme jako text prvku static text (IDC_KOPIE). Toto budeme provádět pouze pokud je v daném okamžiku zaškrtnut check-box (IDC_SLEDOVAT). Do handleru WM_COMMAND si přidejme násjedující kód, který vše zrealizuje:
|
Výsledek "v akci" vidíte na následujícím obrázku:
Ještě si můžeme nastavit výchozí stav check-boxu na zaškrtnutý v handleru zmíněné zprávy WM_INITDIALOG:
|
Tolik pro toto pokračování a příště se samozřejmě budeme prvkům na dialogu dále věnovat, neboť jde o základní část většiny programů, tedy uživatelské rozhraní. Doprovodný projekt si můžete stáhnout zde: win_api_13.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