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 - 27.
winapi_logo
9. září 2002, 00.00 | V tomto článku se podíváme na problematiku oživení vzhledu aplikace nad rámec toho, co nám umožňuje skript zdrojů, a tím i vizuální editor zdrojů.
Jak oživit vzhled aplikace I.V tomto článku se podíváme na problematiku oživení vzhledu aplikace. Z předchozích pokračování tohoto seriálu již víme, že pomocí skriptu zdrojů, a tím tedy samozřejmě také pomocí vizuálního editoru zdrojů (který máme k dispozici například ve Visual C++), nemůžeme u jednotlivých prvků (edit-boxy, list-boxy, tlačítka...) příliš měnit jejich vzhled. Přesně řečeno, ve skriptu zdrojů lze nastavit pouze to, co lze u toho kterého prvku nastavit pomocí stylu okna. Znamená to tedy, že například můžeme nastavit zarovnání textu vpravo u edit-boxu, nebo třeba u list-boxu nebo edit-boxu odstranit vnořené 3D okraje (tj. odebereme vlastnost "client-edge" apod. Ale již nemůžeme například nastavit písmo (font) každému jednotlivému prvku ani barvu textu či pozadí textu.
Existují opravdu vizuální nástroje, které samozřejmě umožňují "programátorovi" naklikat nejrůznější vlastnosti již při návrhu formuláře (tak se většinou nazývá okno aplikace). Toto však je za cenu poměrně výrazného snížení výkonu aplikace a výrazného zvýšení nároků na paměť a další systémové zdroje. Stačí se podívat pomocí Správce úloh (ve Windows NT/2000/XP) na hodnoty jako objekty GDI, popisovače apod. u aplikace vytvořené třeba s pomocí C++ Builderu nebo WinForms. Samozřejmě že tyto nástroje výrazně zrychlují vývoj aplikace, což je v mnoha případech dnes prioritou. Z tohoto hlediska osobně doporučuji používat knihovnu MFC, která je podle mého názoru optimálním "kompromisem" mezi "pohodlím a rychlostí vývoje" a výkonem výsledné aplikace. Zůstávat u čistého API v případě rozsáhlejších programů typu účetnictví apod. je dnes opravdu již nesmysl. Může to být samozřejmě zajímavé "intelektuální cvičení", ale programátor se musí také nějak živit a přizpůsobit volbu vývojových nástrojů "komerčním hlediskům".
Proč tento poměrně rozsáhlý teoretický úvod. Je totiž potřeba vědět, že vše, co si v tomto článku a v dalším pokračování ukážeme, znamená zvýšený nárok na systémové zdroje, který samozřejmě nebude zdaleka tak výrazný, jako když použijeme například celý balík knihovny VCL, ale "bez následků" to zákonitě zůstat nemůže.
Jaké máme tedy možnosti "customizace" běžných prvků Windows. Pokud bychom chtěli mít naprostou kontrolu nad jejich vzhledem, pak bychom u části z těchto prvků mohli použít tzv. "uživatelské kreslení". O něm si však řekneme až příště, nyní se podíváme na jednodušší způsob, kterým je použití zpráv typu WM_CTLCOLORxxx, kde xxx je typ jednoho z prvků, které toto podporují. Tímto "prvkem" může být i samo dialogové okno.
Ukázkový projekt je aplikace založená na hlavním dialogovém okně. Podívejme se, jak nastavit pozadí celého dialogu tak, jak to vidíte na obrázku (aniž bychom cokoli vykreslovali v handleru zprávy WM_PAINT). Zpráva WM_CTLCOLORDLG je posílána do procedury okna dialogu před tím, než jej systém vykreslí. V reakci na tuto zprávu můžeme specifikovat barvu nebo štětec, který bude použit pro vykreslení textu a pozadí dialogu. V parametru wParam této zprávy máme k dispozici kontext zařízení (HDC) dialogu. Pokud chceme specifikovat vlastní štětec, musíme v handleru této zprávy vrátit handle štětce (HBRUSH), který bude použit pro výplň pozadí dialogu. Vytvoříme si tedy při spuštění aplikace štětec (na základě bitmapy načtené ze zdrojů), jehož handle budeme vracet v handleru zprávy WM_CTLCOLORDLG. Podívejme se nyní na úplný výpis zdrojového kódu aplikace:
|
Z uvedeného je vidět, že štetec g_hbPozadi použijeme jako návratovou hodnotu u všech zpráv typu WM_CTLCOLORxxx. Pro všechny tyto zprávy také platí, že jejich parametr wParam je handle kontextu zařízení (HDC) a lParam je handle (HWND) okna prvku, kterého se tato zpráva týká.
V případě prvků jako je edit, static nebo list-box pak můžeme jednoduše použít handle kontextu zařízení (parametr wParam) pro nastavení barvy textu a pozadí textu těchto prvků pomocí funkcí SetTextColor, SetBkColor a SetBkMode - jak vidíte ve výpisu.
Téma vlastního vzhledu tlačítek si necháme na příští pokračování.
V reakci na žádosti některých čtenářů jsem umístil do balíku ke stažení kromě zdrojů také spustitelný exe soubor aplikace (v release konfiguraci). Zde si můžete ukázkový projekt stáhnout: win_api_27.zip (87 kB).
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