..::Pφsmo::..

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

Korean Windows:
JOHAB_CHARSET
Middle-Eastern Windows:
HEBREW_CHARSET
ARABIC_CHARSET
Thai Windows:
THAI_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