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čime se Win API - 20.
winapi_logo
20. května 2002, 00.00 | V minulém pokračování jsme si ukázali ten nejjednodušší způsob, jak vykreslit
bitmapu. V tomto pokračování si ukážeme některé další funkce pro kreslení
grafických objektů, které mají více možností.
V minulém pokračování jsme si ukázali ten nejjednodušší způsob, jak vykreslit bitmapu. V tomto pokračování si ukážeme některé další funkce pro kreslení grafických objektů, které mají více možností. Podívejme se na výsledek dnešního ukázkového příkladu. Je zde opět vykreslena bitmapa (jiným způsobem než v minulém článku) a dále ikona v různých režimech zobrazení, a nakonec ikona o velikosti 48x48.
Pokud chceme například na grafický objekt (včetně výpisu textu) aplikovat efekty jako je například "disabled", tedy vykreslení objektu tak jak bývá obvyklé u zakázaných prvků, jako tlačítka na panelu nástrojů nebo texty i obrázky u zakázaných položek menu, můžeme použít funkci DrawState:
|
Tato funkce nám například v případě bitmapy umožňuje její přímé vykreslení bez nutnosti vytvářet pro ni kontext zařízení. Stačí nám pouze mít platný handle bitmapy. Kresleným objektem může být kromě bitmapy také ikona, kurzor nebo text. V parametru fuFlags máme pak možnost například specifikovat tyto parametry:
- DSS_DISABLED - obrázek nebo text je vykreslen ve stavu "zakázán"
- DSS_MONO - objekt je vykreslen monochromaticky s tím, že můžeme specifikovat handle štětce (parametr hbr) určující tento monochromatický štětec.
Při použití této funkce navíc nemusíme uvádět rozměry kresleného objektu, pokud uvedeme hodnoty 0, funkce sama vypočítá velikost objektu a vykreslí jej celý. Typ grafického objektu určíme v parametru fuFlags, který může nabývat například následujících hodnot:
- DST_BITMAP - objektem je bitmapa. Handle bitmapy je v parametru lData.
- DST_ICON - Ikona, handle ikony je lData.
- DST_TEXT - Vypisujeme text. Parametr lData je adresa textového řetězce.
- DST_PREFIXTEXT - Text může obsahovat akcelerátory, tedy znak '&' je považován za příkaz k podtržení následujícího znaku tak, jak se to používá u zkratkových kláves nabídek.
Dále si řekněme o univerzálnější a šikovnější funkci pro načítání bitmap, ikon a kurzorů, kterou je LoadImage:
|
Tato funkce umí například načítat všechny uvedené typy grafických objektů nejen ze zdrojů, ale také ze souboru. Uveďme si některé volby, které můžeme specifikovat v parametru fuLoad:
- LR_LOADFROMFILE - načte objekt ze souboru místo ze zdrojů
- LR_LOADTRANSPARENT - všechny pixely, které mají stejnou barevnou hodnotu jako první pixel (0,0) jsou nahrazeny barvou pozadí okna.
- LR_MONOCHROME - načte obrázek černobíle
Dále máme možnost také u ikon a kurzorů specifikovat vlastní rozměry. Lze tak například načíst ikonu nebo kurzor rozměru 48x48, což je zejména ve Windows XP jeden z běžných rozměrů obrázku obsažených v ikoně.
V souvislosti s kreslením ikon či kurzorů si řekněme ještě o jedné funkci, kterou je DrawIconEx:
|
Jak je patrné z parametrů, můžeme zde například vykreslit libovolný "krok" v animovaném kurzoru. Můžeme samozřejmě také specifikovat požadované výsledné rozměry obrázku, lze tak tedy ikonu či kurzor kreslit roztažené do libovolné velikosti.
Další možnosti všech uvedených funkcí naleznete samozřejmě v dokumentaci a můžete tedy sami dále experimentovat.
Nyní se podívejme na kód handleru WM_PAINT dnešního doprovodného příkladu:
|
Nejprve je zde ukázka načtení bitmapy ze souboru a její vykreslení (bez použití dalšího kontextu zařízení) pomocí funkce DrawState. Stejnou funkcí je také vykreslena ikona, v prvním případě v běžném stavu, ve druhém monochromaticky, přičemž je použit vlastní štětec definující monochromatickou barvu, a dále tatáž ikona jako "zakázaná". Na konec je nakreslena ikona obsahující obrázek velikosti 48 x 48 tak, že je načten právě tento obrázek. O tom, že je vybrán právě tento a nikoliv 32x32, který by byl roztažen, se lze přesvědčit z parametrů funkce DrawIconEx, kde jsou rozměry uvedeny jako 0, a tedy funkce použije velikost obrázku, který je načten.
Nakonec ještě důležitá poznámka pro spuštění projektu. Bitmapa "eso.bmp" musí být v adresáři, kde běží program, tedy obvykle \debug nebo \release. Já jsem ji přidal mezi zdrojové kódy a další soubory projektu. Samozřejmě můžete ve funkci LoadImage uvést libovolnou plnou cestu k vlastní bitmapě. Zde je tedy ukázkový příklad: win_api_20.zip (158 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