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 - 6.
winapi_logo
12. února 2002, 00.00 | V tomto pokračování se naučíme o trochu více o funkcích GDI, tedy kreslení do okna, přičemž kreslením máme na mysli také výstup textu, neboť Windows jsou grafické uživatelské rozhraní.
Minulé pokračování jsme ukončili tím, že jsme si tím nejjednodušším způsobem vypsali do okna text tak, aby zůstal na svém místě po celou dobu běhu programu. V té souvislosti jsme si řekli obecně jak funguje překreslování okna v reakci na zprávu WM_PAINT. V tomto pokračování se naučíme o trochu více o funkcích GDI, tedy kreslení do okna, přičemž jak jsem již uvedl kreslením budu mít nadále na mysli také výstup textu.
Nejdříve si řekneme o další funkci pro výpis textu, kterou je DrawText:
|
Tato funkce se liší od funkce TextOut především tím, že cílové souřadnice nejsou určeny souřadnicemi počátku textu, ale obdélníkem (struktura RECT), do kterého je text formátován způsobem určeným parametrem uFormat. Navíc je zde drobná výhoda v tom, že tato funkce akceptuje jako parametr nCount (délka textu) hodnotu -1, při které si sama spočítá celkovou délku zadaného textu a správně jej vypíše. Řekněme si o některých běžně používaných hodnotách, ze kterých se skládá parametr uFormat:
- DT_CENTER - vystředí text horizontálně
- DT_LEFT - zarovná text horizontálně vlevo
- DT_RIGHT - zarovná text horizontálně vpravo
- DT_SINGLELINE - vypíše text do jedné řádky i kdyby obsahoval znaky konce řádků. Tento parametr je dále významný proto, že následující formátovací volby fungují pouze za současného použití DT_SINGLELINE.
- DT_VCENTER - vystředí text vertikálně
- DT_BOTTOM - zarovná text ke spodnímu okraji obdélníka lpRect
Další formátovací parametry umožňují s textem dělat ještě více, zatím je zde nebudu vysvětlovat, zájemci je samozřejmě naleznou v dokumentaci.
Ukážeme si tedy, jak dosáhnout toho, aby náš text byl stále zobrazován uprostřed okna. Přesně řečeno uprostřed obdélníka jeho klientského oblasti. Pro lepší budoucí přehlednost našeho kódu, který budeme postupně rozšiřovat, si budeme pro jednotlivé postupy vytvářet vlastní funkce s parametrem HDC získaným v handleru zprávy WM_PAINT, z kterého tyto funkce budeme volat, případně jejich volání "zapoznámkujeme" pro lepší přehlednost výsledného výstupu. Vytvoříme si tedy funkci pro zmíněné vycentrování textu:
|
Tuto funkci si zavoláme z handleru zprávy WM_PAINT, který jsme si vytvořili již minule:
|
Když nyní program spustíme, text bude uprostřed okna. Když budeme okno roztahovat za okraj, text se bude automaticky překreslovat tak aby byl stále uprostřed. Ale pozor! Automatické překreslování textu, resp. celé klientské oblasti okna je závislé na nastavení stylu třídy okna. Když se podíváte do funkce InitApp, kde jsme registrovali třídu, najdete tam tento řádek:
wc.style = CS_HREDRAW | CS_VREDRAW;Tyto vlastnosti ve stylu třídy určují, jak jejich název napovídá, zda se při horizontální či vertikální změně velikosti okna má překreslit celá klientská oblast. Když si zkusíte hodnotu wc.style nastavit na 0, zjistíte, že při roztažení okna zůstane text stále na místě do té doby, než bude jeho překreslení vyvoláno "standardním" způsobem, tedy například, skrytím a znovuodkrytím okna.
Nyní provedeme změnu v nastavení pozadí okna. Nastavíme jeho barvu tak, aby odpovídala systémové barvě prostorových prvků. Změníme proto jeden řádek ve funkci InitApp takto:
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);Po spuštění programu zjistíme, že již to není to pravé ořechové.
Bílý podklad textu nepůsobí příliš esteticky. Bývá zvykem, že texty se vypisují jako průhledné s podkladem odpovídajícím barvě, nebo i vzorku okna.
Musíme se tedy naučit nastavovat barevné parametry textového výstupu. Je důležité vědět, že následující funkce, kterými se budeme zabývat, nastaví příslušnou vlastnost kontextu zařízení a nikoli textu nebo jen některé funkci. Znamená to, že po nastavení některé z vlastností bude tato vlastnost aplikována na všechny následné volání funkcí pro výstup textu (zatím používáme 2 - TextOut a DrawText). Na druhou stranu toto nastavení se "ztratí", jakmile ukončíme kreslení funkcí EndPaint. Nyní již ke třem základním funkcím, nastavujícím barvy textového výstupu.
Nastavení barvy písma:
|
Nastavení barvy pozadí textu:
|
Nastavení průhlednosti textu:
|
Hodnota crColor použitá u prvních 2 funkcí je 32-bitové číslo, v jehož nejnižší BYTE obsahuje hodnotu červené složky barvy, následující zelené a modré. Nejvyšší BYTE musí být 0. V tomto seriálu se postupně dostaneme k funkcím, resp. makrům, umožňujícím pohodlnější práci s typem COLORREF. Běžně se požívá hexadecimální zápis ve tvaru 0x00BBGGRR, kde BB, GG a RR jsou ony barevné složky v rozsahu 0x00 - 0xFF.
Parametr iBkMode ve funkci SetBkMode může nabývat 2 předdefinovaných hodnot:
- OPAQUE - pozadí textu je vyplněno barvou nastavenou funkcí SetBkColor.
- TRANSPARENT - průhledný text, pozadí textu je tvořeno pozadím okna.
Tímto jsme se tedy dostali k odpovědi na otázku, jak vypsat text průhledný, jak to bývá zvykem a jak to i lépe vypadá. Ukažme si tedy na závěr praktickou realizaci. Nejprve se podívejte na výsledek:
A takto vypadá zdrojový kód funkce, kterou si zavoláme z funkce OnWM_PAINT:
|
Zde si můžete stáhnout zdrojový kód: win_api_6b.zip
Na závěr ještě kontrolní otázka:
Jak v případě takto
vypisovaného textu zabránit tomu, aby při roztahování okna za jeho okraj text problikával?
Intenzita blikání je samozřejmě závislá na použitém hardware.
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