Kurz1 - Kapitola8

17. června 2007 v 16:09 | http://www.sweb.cz/kurz_evt/ |  Programování pro WinCE

3.2 Změna fontu

Při pohledu na obrázek v předcházejícím díle se vám na první pohled nemusí líbit grafické uspořádání zobrazeného textu. Řádky jsou různě dlouhé a jednotlivá písmena "nezařezávají" pěkně pod sebou. Je to dáno tím, že standardní font, který nám nabízí kontext zařízení má nastaven font s proměnnou šířkou písma.
Abychom písmena srovnali do hezkých sloupečků pod sebe, máme dvě možnosti. První z nich je vypočítat pozice x každého písmene na řádku a jednotlivá písmena tam umístit. Druhou možností je použít font s konstantní šířkou písma.
Druhá varianta je jednodušší, proto ji také využijeme. Již jsme si řekli, že kontext zařízení nese řadu atributů pro konkrétní grafické rozhraní. Kromě vlastností per, štětců a jiných pomůcek, jsou v kontextu uloženy i informace o použitém fontu. Nevyhovuje-li nám standardně nachystaný, musíme si vytvořit vlastní font, který pak do kontextu zařízení vložíme.
Jako první krok si do globalních proměnných přidáme proměnnou typu handle fontu:
HFONT      hFontPS;                // Font s pevnou sirkou pisma
Také budou potřeba některé lokální proměnné ve WndProc:
// Na praci s fontem
TEXTMETRIC tm;
LOGFONT lf;
HFONT hPuvodFont, hPomFont;
Většina práce se nyní odehraje při zpracování zprávy WM_CREATE, kde si vytvoříme font s pevnou šířkou. Postup je následující:
  • Do proměnné tm si uložíme hodnoty standardního systémového fontu.
  • Do proměnné lf si překopírujeme potřebné hodnoty a při kopírování nastavíme položku lf.lfPitchAndFamily na konstantní šířku písma.
  • Vytvoříme pomocí funkce CreateFontIndirect požadované písmo a jeho handle si uložíme v hFontPS.
  • V položce tm.tmHeight je výška fontu, můžeme tedy nahradit námi odhadnutou hodnotu v proměnné nVyskaRadku skutečnou výškou fontu.
   // Priprava fontu s pevnou sirkou znaku
hdc = GetDC (hWnd);
hPomFont = (HFONT)GetStockObject (SYSTEM_FONT);
hPuvodFont = (HFONT)SelectObject (hdc, hPomFont);
GetTextMetrics (hdc, &tm);
SelectObject (hdc, hPuvodFont);
ReleaseDC (hWnd, hdc);
// Mam parametry systemoveho fontu, mohu vytvorit podobny
memset (&lf, 0, sizeof (lf));
lf.lfHeight = -(tm.tmHeight);
lf.lfWeight = tm.tmWeight;
lf.lfItalic = tm.tmItalic;
lf.lfUnderline = tm.tmUnderlined;
lf.lfStrikeOut = tm.tmStruckOut;
lf.lfCharSet = tm.tmCharSet;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfPitchAndFamily = (tm.tmPitchAndFamily & 0xf0) | TMPF_FIXED_PITCH;
lf.lfFaceName[0] = TEXT ('\0');
// V lf mame vse nastaveno - vytvorime pozadovany font
hFontPS = CreateFontIndirect (&lf);
// Na zaver si ulozime skutecnou vysku fontu
nVyskaRadku = tm.tmHeight;
Abychom nezapomněli a úklid, můžeme hned do zpracování zprávy WM_DESTROY doplnit za zrušení bufferu i zrušení vytvořeného fontu.
   if (hFontPS) DeleteObject(hFontPS);
Vlastní použití vytvořeného fontu je již jednoduché. Do zprávy WM_PAINT vložíme za příkaz BeginPaint výběr nového fontu do kontextu zařízení...
   hPuvodFont = (HFONT)SelectObject(hdc,hFontPS);
... a před EndPaint zase vrátíme původní font do kontextu zařízení
   SelectObject(hdc,hPuvodFont);
Jestliže program přeložíte a spustíte, měl by se výsledek proti obrázku č. 16 změnit asi takto:

obr. 17 Úprava fontu v programu "HexaView"
Pokud se vám jej podařilo získat, dosáhli jste cíle tohoto krátkého dílu. :-)

Co bychom si měli z této lekce zapamatovat?

  • Do kontextu zařízení lze vybrat font podle potřeby.
  • Vlastní font si můžeme vytvořit na základě jiného fontu pomocí CreateFontIndirect.
 

Buď první, kdo ohodnotí tento článek.

Nový komentář

Přihlásit se
  Ještě nemáte vlastní web? Můžete si jej zdarma založit na Blog.cz.