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 - 28.
winapi_logo
26. září 2002, 00.00 | V dnešním pokračování seriálu o Win API si ukážeme použítí vlastního tlačítka s prakticky libovolným vzhledem.
Uživatelsky kreslená tlačítkaV minulém článku jsme si slíbili, že úpravu vzhledu tlačítek si necháme do dalšího pokračování. Bylo tomu tak z důvodů, že u tlačítek nelze použít zprávu typu WM_CTLCOLORxxx tak, jak jsme si použili u prvků v minulém díle.
U tlačítek máme v zásadě 2 možnosti. Tou jednodušší je možnost nastavit tlačítku ikonu nebo bitmapu. Z toho však plynou leckdy závažná omezení. Nemůžeme například dynamicky měnit text tlačítka (funkcí SetWindowText), neboť text okna se na tlačítku nezobrazí.Celý "obraz" tlačítka totiž je tvořen tlačítkem nakresleným systémem, na kterém je námi nastavená bitmapa. Nic více tam již nedostaneme. Museli bychom tedy mít předem připraveny bitmapy se všemi možnými texty a tyto celé bitmapy pak dynamicky měnit, což by určitě bylo pracné a také náročné na zdroje programu. Druhou možností je použít tzv. uživatelsky kreslená tlačítka. Pak máme možnost plné kontroly nad vzhledem tlačítka a můžeme na něj kreslit vše, co umíme nakreslit do kontextu zařízení (HDC).
Na obrázku vidíte vlevo ukázku tlačítka s nastavenou bitmapou. K nastavení bitmapy (popř. ikony) použujeme zprávu BM_SETIMAGE, tak jak vidíte v ukázce kódu doprovodného projektu:
|
Tato funkce je volána v handleru zprávy WM_INITDIALOG, tedy "těsně" před prvním zobrazením dialogu na obrazovce. Ještě musíme v editoru zdrojů příslušnému tlačítku nastavit vlastnost "Bitmap" na True (styl okna BS_BITMAP).
Nyní se podívejme na další 2 tlačítka, která jsou již plně uživatelsky kreslena. V editoru zdrojů musíme takovým tlačítkům nastavit vlastnost "Owner Draw" na True (odpovídá to stylu okna BS_OWNERDRAW). Když nyní dialog spustíme, tyto tlačítka vůbec na dialogu nebudou vidět, musíme je tedy ve správný čas kreslit sami. O tom, kdy nastal ten správný čas, nás informuje systém. Rodičovskému oknu, tedy našemu dialogu je poslána zpráva WM_DRAWITEM, obsahující v parametru lParam adresu struktury DRAWITEMSTRUCT:
|
V této struktuře máme všechny potřebné informace k vykreslení buttonu (totéž platí i o dalších prvcích podporující uživatelské kteslení - listbox, combobox apod.). Struktura obsahuje také informace o stavu tlačítka - zda je například právě zamáčknuté, zda má klávesnicový fokus apod.
Podívejme se nyní na konkrétní realizaci. V projektu máme 2 tlačítka kreslená uživatelsky. Chceme mít na obou stejné pozadí tvořené bitmapou. Tuto bitmapu si tedy přidáme do zdrojů (IDB_POZADI). Zobrazované ikony jsou systémové ikony (IDI_INFORAMTION a IDI_ERROR) a každé tlačítko má svůj vlastní text. Vše ostatní již realizujeme v handleru zprávy WM_DRAWITEM, ve kterém zavoláme následující vlastní kreslící funkci, které jako parametr předáme lParam procedury dialogu.
|