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 - 18.
winapi_logo
6. května 2002, 00.00 | V tomto pokračování se seznámíme s dalším objektem GDI, kterým bude font (handle typu HFONT). Naučíme se, jak měnit písmo při vypisování textu, včetně toho, jak psát pod libovolným úhlem, tedy třeba svislý text.
V tomto pokračování se seznámíme s dalším objektem GDI, kterým bude font (handle typu HFONT). Ve všech dosavadních ukázkách jsme volbu písma nechávali na systému, který nám při výpisu textu do kontextu zařízení vybral příslušný systémový font. Jediné, co jsme mohli ovlivnit, byla barva písma a pozadí. A to proto, jak jsme si řekli, že tyto atributy jsou vlastnostmi (nikoli objekty), které jsme nastavili kontextu zařízení (HDC). Fonty (HFONT) jsou však objekty obdobné perům (HPEN) a štětcům (HBRUSH), se kterými jsme se již seznámili. Znamená to tedy, že musíme nějakým způsobem vytvořit (nebo získat již existující) handle objektu HFONT, přiřadit ho do kontextu zařízení funkcí SelectObject a poté veškeré následné výstupy textu budou používat tento font. Ukážeme si, jak dosáhnout třeba takovýto výsledek:
Vytvoření fontuPro přímé vytvoření fontu můžeme použít funkci CreateFont:
|
Jak je vidět, je třeba zadat různé parametry písma. Jejich přesný význam a definované konstanty pro jednotlivé hodnoty naleznete v nápovědě a nebudu je zde rozepisovat. Řekněme si však o další, někdy šikovnější možnosti vytvoření fontu. Je jí funkce CreateFontIndirect:
|
Když se však podíváte na strukturu, LOGFONT, zjistíte, že její prvky odpovídají parametrům funkce CreateFont. V čem je tedy výhoda? Spočívá v tom, že si můžeme nejprve nechat "předvyplnit" strukturu LOGFONT parametry nějakého systémového písma, a poté pouze změnit ty vlastnosti, které požadujeme. K tomu použijeme již zmíněnou funkci GetObject:
|
Handle na některý systémový font můžeme získat pomocí funkce GetStockObject:
|
Pokud chceme získat výchozí font, který systém Windows používá pro grafické objekty, použijeme hodnotu DEFAULT_GUI_FONT.
Použití fontu v kontextu zařízeníUkažme si nyní na konkrétním příkladě aplikaci těchto poznatků. Nejdříve se podívejte na kompletní výpis handleru zprávy WM_PAINT, který realizuje to, co vidíte na úvodním screen-shotu:
|
Získání handle kontextu zařízení v proceduře okna byste již měli znát z minulých dílů, pro úplnost ho zde uvedu:
|
Jak je vidět z výpisu, jde vždy o modifikaci požadované vlastnosti písma ve struktuře LOGFONT, použití funkce CreateFontIndirect a výběr fontu do kontextu zařízení. Samozřejmě nesmíme zapomenout vytvořený font po použití vždy zrušit funkcí DeleteObject a pak teprve toto handle použít pro vytvoření dalšího fontu. V ukázce vidíte také, jak vypsat písmo pod libovolným úhlem. V tom nejjednodušším případě (výchozím grafickém módu) nastavíme prvek lfEscapement na hodnotu vyjadřující sklon základny textu vůči ose x v desetinách stupně. Použitá hodnota 90 tedy představuje pravý úhel a 180 písmo otočené "vzhůru nohama".
Nastavení písma oknu (prvku na dialogu)Nyní si ještě ukážeme, jak nastavit vlastní font některému prvku Windows. Mohl by jím být edit, button apod. Ukážeme si to u dialogu "about.box", kde máme prvek typu "STATIC". V editoru zdrojů musíme pouze změnit identifikátor static prvku na hodnotu jinou, než je IDC_STATIC. Vše ostatní zařídíme v proceduře dialogu, kde při inicializaci (handler zprávy WM_INITDIALOG) vytvoříme vlastní font a nastavíme jej prvku pomocí zprávy WM_SETFONT. Před ukončením dialogu font opět zrušíme.
|
Výsledek vidíte na obrázku:
Ještě poznámku ke kódu. Jak si můžete všimnout, pro poslání zprávy požadovanému prvku na dialogu, u něhož známe identifikátor ale nikoli handle, můžeme použít místo funkce SendMessage funkci SendDlgItemMessage:
|
kde zadáváme handle dialogu a identifikátor prvku. Pokud bychom opravdu potřebovali znát handle prvku, samozřejmě můžeme ho zjistit pomocí funkce GetDlgItem:
|
která nám vrátí handle, na základě handle rodičovského dialogu a identifikátoru prvku.
Zde si můžete stáhnout ukázkový projekt (Microsoft Visual C++ .NET) win_api_18.zip (27 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
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