Pou₧itφ pφsma je velmi jednoduchΘ. StaΦφ zavolat funci SelectObject, p°edat jφ jako parametr po₧adovanΘ pφsmo a potΘ jsou vÜechny texty vykreslovßny tφmto pφsmem. Mnohem t∞₧Üφ je toto pφsmo nadefinovat p°esn∞ takovΘ jakΘ chcete. A to se vßs v tomto Φlßnku pokusφm nauΦit.
NejjednoduÜÜφ cestou jak vytvo°it po₧adovanΘ pφsmo je funkce CFont::CreatePointFont.
Ta mß t°i parametry:
int nPointSize - je to po₧adovanß velikost pφsma v
desφtkßch bod∙. Tak₧e kdy₧ chcete nap°. pφsmo velikosti 12 zadßte 120.
LPCTSTR lpszFaceName - je to jmΘno po₧adovanΘho
fontu. Nap°. "Times New Roman"
CDC* pDC - je to ukazatel na DC, ve kterΘm se
toto pφsmo bude pou₧φvat. Pokud ponechßte implicitnφ NULL, pou₧ije se DC
obrazovky. Ale pozor. Pokud toto pφsmo pou₧ijete nap°. pro v²pis na tiskßrnu
bude mnohem menÜφ ne₧ na obrazovce, proto₧e pixely tiskßrny jsou menÜφ ne₧
obrazovky. Tak₧e pokud chcete toto pφsmo pou₧φt p°i v²stupu na tiskßrnu,
nesmφte tomuto parametru ponechat implicitnφ NULL.
Takto vytvo°enΘ pφsmo mß jednu obrovskou v²hodu. Mß po₧adovanou velikost v mapovacφm m≤du MM_TEXT a jedin∞ v tomto mapovacφm m≤du lze pou₧φt funkci DrawText, kterß v jin²ch mapovacφch m≤dech nefunguje. Funce TextOut sice funguje ve vÜech mapovacφch m≤dech, ale neumφ vypsat text o vφce °ßdcφch.
Jeho nev²hodou je, ₧e nem∙₧ete nastavit dalÜφ vlastnosti pφsma jako zda je tuΦnΘ, podtr₧enΘ atd.
To umo₧≥ujφ funkce CFont::CreateFont a CFont::CreateFontIndirect.
LiÜφ se jen tφm, ₧e v prvnφm p°φpad∞ musφte vyplnit vÜechny po₧adovanΘ
parametry (je jich 14) a ve druhΘm p°φpad∞ jsou tyto parametry p°edßny
pomocφ struktury u kterΘ m∙₧ete nastavit jenom n∞kterΘ parametry. U t∞chto
dvou funkcφ je problΘm s nastavenφm po₧adovanΘ velikosti pφsma.
Jeden bod (u pφsma) mß velikost 1/72 palce. Mapovacφ m≤d MM_TWIPS mß velikost logickΘho pixelu 1/1440 palce. Tak₧e pokud pou₧ijete mapovacφ m≤d MM_TWIPS a nßsobφte po₧adovanou velikost pφsma v bodech dvaceti, zφskßte po₧adovanou velikost pφsma v logick²ch pixelech a¥ ji₧ pou₧φvßte obrazovku nebo tiskßrnu. Pozor!!! Zadßvejte tuto hodnotu jako zßpornou jinak nezaruΦuji v²sledek. U t∞chto dvou funkcφ zßle₧φ na znamφnku. Nap°. CreateFont(-12*20,.....)
Ale komu se chce pracovat v mapovacφm m≤du MM_TWIPS a muset ka₧d² °ßdek textu vypisovat zvlßÜ¥, kdy₧ mßme funkci DrawText. Ta ale bohu₧el funguje jen v mapovacφm m≤du MM_TEXT jak jsem ji₧ uvßd∞l.
NaÜt∞stφ mßme jeÜt∞ funkci CFont::CreatePointFontIndirect.
Ta vypadß stejn∞ jako CreateFontIndirect, ale mß navφc druh² parametr, ukazatel na CDC, kter² mß stejn² v²znam jako u funkce CreatePointFont.
Prvnφ parametr const LOGFONT* lpLogFont je ukazatel na strukturu LOGFONT,
kterß popisuje po₧adovanΘ pφsmo.
Je to ·pln∞ stejnß struktura jako u funkce CreateFontIndirect. LiÜφ se
pouze v²znamem polo₧ky lfHeight (v²Üka pφsma).
Nßsleduje popis struktury LOGFONT.
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
lfHeight - Udßvß v²Üku pφsma v logick²ch jednotkßch. Je
interpretovßna takto:
Je-li >0 pak je to zßkladnφ v²Üka pφsma. Tj. v²Üka pφsma + v²Üka no₧iΦek
(internal-leading) u jpqy (kterΘ se obvykle pφÜφ pod °ßdku.
Je-li =0 pak se pou₧ije implicitnφ velikost pφsma.
Je-li <0 pak je to v²Üka pφsma. Tj. zßkladnφ v²Üka pφsma - v²Üka no₧iΦek.
Tato v²Üka se pou₧φv² pro urΦovßnφ velikosti pφsma.
Pro funkci CreatePointFontIndirect mß tato hodnota zvlßÜtnφ v²znam. Neudßvß velikost pφsma v logick²ch jednotkßch, ale velikost pφsma v desφtkßch bod∙. Tak₧e pro pφsmo velikost pφsma 12 zadßte hodnotu 120.
lfWidth - UrΦuje pr∙m∞rnou Üφ°ku znaku pφsma v logick²ch jednotkßch. Pokud zadßte 0, pou₧ije se implicitnφ hodnota.
lfEscapement - ┌hel v desφtkßch stup≥∙ mezi osou x a p°φmkou na kterou se text vypisuje. (ZkouÜel jsem to, ale nefunguje.)
lfOrientation - ┌hel v desitkßch stup≥∙ udßvajφcφ sklon jednotliv²ch znak∙. (ZkouÜel jsem, ale nefunguje.)
lfWeight - TuΦnost pφsma. PlatnΘ hodnoty jsou od 0 do 1000. Exitujφ nßsledujφcφ p°eddefinovanΘ konstanty:
FW_DONTCARE | 0 |
FW_THIN | 100 |
FW_EXTRALIGHT | 200 |
FW_ULTRALIGHT | 200 |
FW_LIGHT | 300 |
FW_NORMAL | 400 // normßlnφ |
FW_REGULAR | 400 |
FW_MEDIUM | 500 |
FW_SEMIBOLD | 600 |
FW_DEMIBOLD | 600 |
FW_BOLD | 700 // tuΦnΘ |
FW_EXTRABOLD | 800 |
FW_ULTRABOLD | 800 |
FW_HEAVY | 900 |
FW_BLACK | 900 |
lfItalic - UrΦuje zda je pφsmo prolo₧enΘ TRUE (italic) nebo ne FALSE.
lfUnderline - UrΦuje zda je pφsmo podtr₧enΘ TRUE nebo ne FALSE.
lfStrikeOut - UrΦuje zda je pφsmo p°eÜkrtnutΘ TRUE nebo ne FALSE.
lfCharSet - UrΦuje znakovou sadu. Jsou p°eddefinovanΘ nßsledujφcφ
hodnoty:
ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET //
Znakovß sada je pln∞ popsßna jmΘnem a velikostφ pφsma
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET // V
zßvislosti na sytΘmu
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
Pro st°ednφ evropu (Φechy) je platnß hodnota 238.
lfOutPrecision - Udßvß p°esnost v²stupu. Tj. udßvß jak se v²stupnφ font blφ₧φ po₧adovanΘmu. Nebo pokud je v systΘmu vφce pφsem stejnΘho jmΘna °φdφ v²b∞r z nich.
lfClipPrecision - P°esnost p°ipojenφ. Nepochopil jsem co to mß d∞lat.
lfQuality - UrΦuje kvalitu v²stupu. Mo₧nosti:
DEFAULT_QUALITY | Nezßle₧φ na vzhledu |
DRAFT_QUALITY | Vzhled nenφ to nejd∙le₧it∞jÜφ. Pokud je t°eba jsou generovßny pφsma nedefinovan²ch velikostφ. |
PROOF_QUALITY | Nejvφce zßle₧φ na vzhledu. Pokud nenφ definovßno pφsmo danΘ velikosti, pou₧ije se nejbli₧Üφ existujφcφ. Pokud je t°eba, jsou generovßny tuΦnß, podtr₧enß atd. |
lfPitchAndFamily - UrΦuje h°iÜt∞ (pitch) a rodinu (family) pφsma.
Je to kombinace nßsledujφcφh hodnot:
pitch:
DEFAULT_PITCH
FIXED_PITCH
VARIABLE_PITCH
rodina:
FF_DECORATIVE //originßlnφ pφsma nap°.
staroanglickΘ
FF_DONTCARE //nezßle₧φ
na nφ, nebo ji neznßme
FF_MODERN //pφsma
s konstatnφ vzdßlenostφ znak∙ nap°. CourierNew
FF_ROMAN
//proporcionßlnφ pφsma s patkou nap°. MS Serif
FF_SCRIPT
//pφsma navr₧enß aby vypadala jako napsanß rukou. nap°.
Script nebo Cursive
FF_SWISS
//proporcionßlnφ pφsma bez patky nap°. MS Sanf Serif
lfFaceName - JmΘno pφsma. To samΘ jako ve slo₧ce Fonts. Pro zjiÜt∞nφ dostupn²ch pφsem m∙₧e b²t pou₧ita funkce EnumFontFamilies. Pokud je tento parametr NULL, bude pou₧ito prvnφ pφsmo odpovφdajφcφ ostatnφm parametr∙m. Maximßlnφ dΘlka nßzvu pφsma vΦetn∞ ukonΦovacφho znaku (\0) je 32. Nap°. "Times New Roman".
A nakonec uvedu p°φklad nadefinovßnφ pφsma Times New Roman o velikosti 12 bod∙ pro funkci CreatePointFontIndirect.
LOGFONT lf;
ZeroMemory(&lf,sizeof(LOGFONT)); // nulovßnφ pam∞ti
lf.lfCharSet = 238; // znakovß sada - st°ednφ evropa
strcpy(lf.lfFaceName,"Times New Roman"); // jmΘno pφsma
lf.lfHeight = 120; // v²Üka pφsma 120 desetin bodu