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 - 19.
winapi_logo
13. května 2002, 00.00 | V tomto pokračování se seznámíme s dalším objektem GDI - bitmapami. Ukážeme
si jak vykreslit bitmapu uloženou ve zdrojích programu do okna. V té souvislosti
si také ukážeme použití štětců tvořených vzorkem z bitmapy.
V tomto pokračování se seznámíme s dalším objektem GDI - bitmapami. Ukážeme si jak vykreslit bitmapu uloženou ve zdrojích programu do okna. V té souvislosti si ukážeme použití štětců tvořených vzorkem z bitmapy.
Na obrázku vidíte konečný výsledek dnešního výkladu: jde o okno, jehož štětec pozadí je definován vzorkem z bitmapy a v handleru zprávy WM_PAINT je uprostřed okna vykreslena bitmapa (fotografie v true-color barevné hloubce).
Co je to bitmapa ?Z pohledu programátora je bitmapa grafický objekt podobný jako nám již známá pera nebo štětce. Znamená to že musíme "nějakým způsobem" získat handle bitmapy (ať už již existující nebo námi vytvořené), poté tento handle vybrat do kontextu zařízení, s kterým pak můžeme "pracovat". Jednotlivé pixely tohoto kontextu zařízení (obsahujícího bitmapu) pak představují barevné body tvořící bitmapu. Barva každého pixelu je určena třemi barevnými složkami - červená, zelená a modrá - každá z nich může mít definovanou intenzitu v rozsahu 0-255 (1 BYTE).
Nejjednodušším způsobem získání handle bitmapy je její načtení ze zdrojů (resources) programu funkcí LoadBitmap:
|
Tato funkce nám vrátí handle bitmapy. Často chceme získat nějaké informace o takto načtené bitmapě. Obvykle nás zajímají především její rozměry (z důvodu jejího umístění při kreslení). Protože bitmapa je grafický objekt, použijeme již známou funkci GetObject:
|
V případě bitmapy je bufferem pro informaci o objektu struktura BITMAP:
|
Většinou chceme bitmapu vykreslit do kontextu zařízení okna. Musíme proto nejprve vytvořit vlastní paměťový kontext zařízení, do něj vybrat handle bitmapy a poté můžeme použít tu nejjednodušší funkci pro kopírování (případně další bitové operace) kontextů zařízení - BitBlt:
|
V tom nejjednodušším případě kopírování bitmapy do kontextu zařízení okna je cílovým hdcDest kontext okna a hdcSrc kontext bitmapy. 2 - 5 parametr definují obdélník v cílovém kontextu zařízení, do kteréhoje bitmapa kreslena a parametry nXSrc a nYSrc definují levý horní roh v bitmapě, od kterrého se začíná kreslit. Pokud je různý od souřadnice (0,0) jde o výřez z bitmapy.
Pokud tedy chceme vykreslit celou bitmapu, musíme nejprve zjistit její rozměry (funkcí GetObject), které pak uvedeme jako parametry nXDest a nYDest. Pro běžné kopírování je pak typ rastrové operace definován hodnotou SRCCOPY. O dalších možnostech si řekneme někdy příště, nyní si ukažme výpis kódu, který (v handleru zprávy WM_PAINT) realizuje to co vidíme na úvodním screen-shotu. Nejprve k pozadí okna. Již víme že každá třída okna má definovaný štětec, tvořící výplň jeho pozadí. Kromě již probíraných typů štětců existuje ještě štětec tvořený vzorkem bitmapy, který získáme funkcí CreatePatterBrush:
|
Jediné co potřebujeme, je opět handle bitmapy. V projektu jsou přidané do zdrojů 2 bitmapy (IDB_BACKGROUD a IDB_BITMAP1). Pozadí tedy definujeme při registraci třídy okna takto:
|
Nyní již zbývá jen handler zprávy WM_PAINT:
|
Jak je vidět, po použití musíme opět bitmapu zrušit funkcí DeleteObject, stejně jako jiný grafický object. Pro vytvoření kontextu zařízení bitmapy jsem použit tu nejjednodušší funkci CreateComaptibleDC:
|
která nám vytvoří kontext zařízení se stejnými vlastnostmi jako zadaný existující kontext zařízení, v našem případě kontext okna.
Zde si můžete stáhnout ukázkový projekt, který je tentokrát trochu větší z toho důvodu, že obsahuje true-color bitmapy, použité ve zdrojích: win_api_19.zip (437kB);
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
Diskuse k článku
-
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