C++ & C# Programming page
 

 

# Úvod
# Tvůrci
# C++
# C#
# Linky





Mini-seriál o grafice - 3. díl

Třído, v dnešní hodine si probereme vykreslování textů :). Od jednoduchého výpisu po psaní s fontem. Jako pokaždé, tak i teď uvedu obrázek již na začátku, ať každý ví, jaký bude výsledek a jestli to vůbec má pro něj cenu číst.

No a pokud tu stále jste, tak se dáme do toho. Začneme prvním řádkem textu na obrázku, černý text a bílé pozadí.
TCHAR szText1[] = "Text pomocí TextOut";
TextOut(hdc, 20, 20, szText1, strlen(szText1));
S funkcí TextOut jste se již možná setkali, pokud jste četli návod na tisk. Zde se skoro nic nemění, jen HDC není kontext tiskárny, ale kontext klientské vykreslovací oblasti. Druhý a třetí parametr jsou již na první pohled X a Y pozice, další je text k vykreslení a poslední délka textu.


Následující řádek textu byl podroben malé změně, bylo mu nastaveno průhledné pozadí a červený text.

SetBkMode(hdc, 1);
SetTextColor(hdc, RGB(250, 0, 0));
TCHAR szText3[] = "Text pomocí TextOut ale hlavne s průhledným pozadím!";
TextOut(hdc, 20, 60, szText3, strlen(szText3));

SetBkMode nastavuje Background mód, jaký bude použit. Funkce bere jen 2 čísla. 0 - s pozadím, 1 - bez pozadí (průhledné).
SetTextColor změní barvu textu podle vloženého COLORREF, v tomto případě jsem použil funkci RGB, s kterou zadáváte R G B složku pomocí 0 - 255 čísla.


Tento příklad vykreslí pomocí další funkce - DrawText - nápis doprostřed okna.

RECT rect;
GetClientRect(hWnd, &rect);
TCHAR szText2[] = "Text uprostřed okna";
SetBkColor(hdc, RGB(0, 250, 0));
DrawText(hdc, szText2, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

GetClientRect si vytáhne z okna velikost klientské oblasti do které máme možnost vykreslovat a uloží získané informace do RECT.
DrawText narozdíl od TextOut provádí kreslení do oblastni obdelníku, s možností různých zarovnání. Navíc je tu možnost vynechat zjištění délky textu, protože při parametru -1 si ji zjistí funkce sama. Uvedený poslední parametr zapne centrování na střed a na vertikální střed. Ještě poznámka: bez parametru DT_SINGLELINE nefunguje vertikální vycentrování. Centrovat tudíž jde jen jeden řádek textu. Nezapomínat!


A teď konečně fonty.

TCHAR szText4[] = _T("Vlastní písmo s fontem - Comic sans MS");
LOGFONT logFont;
HFONT hFont;
GetObject(GetStockObject(DEFAULT_GUI_FONT), sizeof(logFont), &logFont);
logFont.lfHeight = 35;
logFont.lfItalic = TRUE;
lstrcpy(logFont.lfFaceName, _T("Comic Sans MS"));
hFont = CreateFontIndirect(&logFont);
SelectObject(hdc, hFont);
SetTextColor(hdc, 0x00FF9900);
TextOut(hdc, 20, 100, szText4, strlen(szText4));

Font lze vytvořit více způsoby. Já jsem použil CreateFontIndirect, do kterého je předána naplněná struktura LOGFONT, určující vlastnosti fontu (velikost, italic, bold, náklon atd). Další postup se neliší od předchozích vykreslování textu. Ještě je dobré vědět, že podobně jako barva textu a pozadí se "přenáší" stále dál na každý později vytvořený text, i fonty se přenášejí. Je možné vytvořit handle fontu pro úschovu toho, který bude nahrazen (návratová hodnota SelectObject) a na konci ho vrátit. Tentokrát je však "efekt" úmyslný.


A nakonec před chvílí zmíněný náklon textu.
TCHAR szText5[] = "A jdeme do kopce...";
logFont.lfEscapement = 300;
logFont.lfItalic = FALSE;
HFONT hFontSklon = CreateFontIndirect(&logFont);
SelectObject(hdc, hFontSklon);
SetTextColor(hdc, 0x0000FF00);
TextOut(hdc, 20, 400, szText5, strlen(szText5));

.lfEscapement určuje desetiny stupnů náklonu. 300 tedy znamená 30°. Jinak jde o to samé vykreslování stále dokola a dokola, jen se přidalo nastavení jednoho parametru logFontu.


No a to je asi tak vše, ještě přidám zdrojový kód, k ukázanému programu.

[ Zdrojáky ]



Správce sekce: Dejvino



14.2 2005

C++: pridano par odkazu na clanky o OpenGL, IRC, POP3 a BMP
14.8 2004

C++: přidán klient pro Internet Relay Chat (IRC)
11.7 2004

C++: opravil jsem zdrojak WebServeru, byla tam navic jedna funkce kterou jsem nepridal a mnoho zacatecniku by si s tim nemuselo vedet rady...
27.6 2004

Vytvořen IRC kanál #c-prog na serveru Quakenet
10.6 2004

C++: přidán program WebServer, stojí za prohlédnutí!
5.6 2004

C++: přidán článek o CheckBoxu
29.5 2004

C++: přidán program WinSock Mail
28.5 2004

C#: přidán program DNStoIP
Vaše IP je 54.80.236.48
Stránka byla načtena za 0.0207 sekund.