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 - 11.
winapi_logo
18. března 2002, 00.00 | V tomto pokračování se naučíme, jak vytvořit stavový řádek do nějž budeme průběžně zobrazovat čas, čímž se také seznámíme s časovačem (timer). Kromě toho si řekneme něco o přizpůsobení vzhledu prvků nastavení Windows XP.
V minulém článku jsme se naučili vytvářet ty nejjednodušší dětská okna - prvky Windows, kterým byl edit-box a tlačítko a umíme již zachytávat zprávy od těchto prvků. V tomto díle si vytvoříme stavový řádek okna do kterého budeme vypisovat aktuální čas, abychom se seznámili a časovači (timer). Vzhledem k narůstajícímu počtu uživatelů Windows XP si také, zatím bez podrobnějšího výkladu, ukážeme, jak jednoduše zařídit, aby naše prvky v klientské oblasti měly vzhled podle nastavení Windows XP.
Pokud chceme, aby prvky klientské oblasti používaly nový vzhled odvozený od nastavení Windows XP, musíme to systému říci tzv. "manifestem", což může být externí soubor s přesně definovaným názvem odvozeným od názvu aplikace: JmenoProgramu.exe.manifest, název tedy vytvoříme přidáním "přípony" manifest za název programu (včetně exe). Druhou možností je tento soubor vložit do resources programu zdroj typu RT_MANIFEST nazvaný CREATEPROCESS_MANIFEST_RESOURCE_ID. Tento manifest je textový soubor v XML formátu obsahující příslušné informace. Vzor takového manifestu najdete mezi soubory doprovodného projektu ("WinApi.exe.manifest").
Kromě tohoto manifestu musíme dále v kódu registrovat a inicializovat třídy pro běžné prvky (common controls). To lze udělat funkcí InitCommonControls, ale lépe novější a doporučovanou funkcí InitCommonControlsEx.
|
Tato funkce umožňuje registrovat jednotlivě různé "speciální" prvky, jako například progress-bar, tool-tip a pod, přičemž účinek je kumulativní. Podrobnosti jsou samozřejmě vysvětleny v MSDN. Základní použití tak jak je i v našem doprovodném programu (umístěné na začátek funkce InitApp) vypadá takto:
|
Pro použití této funkce je ještě potřeba mít ve zdrojovém kódu vložen příslušný hlavičkový soubor:
#include <commctrl.h>a do projektu přidat knihovnu comctl32.lib, pokud tedy ji tam již nepřidá "wizard" při vytváření projektu v určitém vývojovém prostředí. Nyní již by ve Windows XP měly i prvky klientské oblasti mít požadovaný vzhled.
Nyní k slíbenému stavovému řádku a výpisu času do něj. Stavový řádek můžeme vytvořit jako okno systémové třídy (kterou tedy nemusíme registrovat) STATUSCLASSNAME, kterou použijeme jako jméno třídy ve funkci CreateWindowEx. Existuje ještě funkce CreateStatusWindow, která je však již zastaralá a je doporučeno používat CreateWindowEx. Takto tedy vytvoříme v našem programu stavový řádek:
|
Hodnota STATUSCLASSNAME je definována jako "msctls_statusbar32", což je skutečné jméno třídy, které získáte třeba pomocí programu Spy++, když si necháte zobrazit údaje o okně stavového řádku. Možná se podivujete nad zadanými rozměry okna, kde jsou "samé nuly". Stavový řádek má totiž jednu šikovnou vlastnost: při změně velikosti jeho rodičovského okna nemusíme přepočítávat a nastavovat jeho rozměry, ale stačí když při zachycení zprávy WM_SIZE v proceduře hlavního okna tuto zprávu přepošleme oknu stavového řádku s tím, že parametry wParam a lParam předáme beze změny. Stavový řádek se pak automaticky drží spodního okraje okna tak jak od něj očekáváme. A vzhledem k tomu že po vytvoření stavového řádku, když dojde k zobrazení hlavního okna, zpráva WM_SIZE je poslána, tak ani počáteční velikost nemusíme počítat a nastavovat, proto ty nuly v rozměrech. Tedy jediné co ještě uděláme, je následující handler v proceduře hlavního okna:
|
Stavový řádek máme tedy vytvořen, nyní něco o časovačích. Každé okno může mít jeden nebo více časovačů (timer), které tomuto oknu posílájí v nastaveném intervalu zprávu WM_TIMER. Její parametr wParam obsahuje identifikátor časovače, abychom mohli jednotlivé časovače rozlišit, pokud jich jednomu oknu nastavíme více. Jak časovač vytvořit a zastavit. K vytvoření a aktivaci časovače slouží funkce SetTimer:
|
Procedury časovače se používají pouze ve zvláštních případech a nemusíme se jí zatím zabývat. Důležité je vědět že interval, ve kterém budou posílány zprávy WM_TIMER se zadává v milisekundách. Pokud chceme časovač zastavit, použijeme funkci KillTimer:
|
Nyní si tedy ukažme, jak ve stavovém řádku zobrazíme hodiny s aktualizací času každou sekundu. Nejprve musíme vytvořit časovač:
|
Toto volání funkce umístíme opět do funkce InitApp, hodnota _TimerClock je definovaná "někde na začátku" jako:
#define _TimerClock 1Poté již naše okno dostávaá každou sekundu zprávu WM_TIMER, na kterou budeme reagovat tak, že získáme systémový čas, převedeme je to textového řetězce a ten nastavíme jako text okna stavového řádku:
|
Pro získání systémového času je zde použita funkce GetLocalTime, která nám naplní strukturu SYSTEMTIME
|
hodnotami určujícími aktuální datum a čas. Zde vidíte výsledek i s použitím manifestu pro nový vzhled prvků ve Windows XP:
Ještě technická poznámka k doprovodnému projektu. Počínaje tímto dílem je projekt ve verzi Visual C++ NET. I když většina čtenářů asi ještě nemá tuto poslední verzi Visual C++ (součást Visual Studia .NET) k dispozici, není problém si vytvořit v příslušné verzi Visual C++ projekt a vždy pouze zkopírovat zdrojové soubory .cpp, .h a skript zdrojů .rc do stávající verze projektu a překompilovat. Zde je tedy doprovodný projekt ke stažení: win_api_11.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