字号转换成像素
For the MM_TEXT mapping mode, you can use the following formula to specify a height for a font with a specified point size:
lfHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
字符串平均字符宽度
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
// here's why we're limited to fixed width fonts.
m_iCharDX = tm.tmAveCharWidth;
m_iCharDY = tm.tmHeight;
LOGFONT
结构LOGFONT的定义如下: typedef struct tagLOGFONT
{ // lf 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: 以逻辑单位指定字体字符元(character cell)或字符的高度。字符高度值为字符元高度值减去内部行距(internal-leading)值。当lfHeight大于0时,字体映射程序将该值转换为设备单位,并将它与可用字体的字符元高度进行匹配;当该参数为0时,字体映射程度将使用一个匹配的默认高度值;如果参数的值小于0,则将其转换为设备单位,并将其绝对值与可用字体的字符高度进行匹配。对于任何一种情况,字体映射程度最终得到的字体高度值不会超过所指定的值。以MM_TEXT映射模式下,字体高度值和磅值有如下的换算公式:lfHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);
lfWidth: 以逻辑单位指定字体字符的平均宽度。如果lfWidth的值为0,则根据设备的纵横比从可用字体的数字转换纵横中选取最接近的匹配值,该值通过比较两者之间的差异的绝对值得出。
lfEscapement:以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。
ifOrientation:以十分之一度为单位指定字符基线相对于页面底端的角度。
lfWeight:指定字体重量。在Windows中,字体重量这个术语用来指代字体的粗细程度。lfWeight的范围为0到1000,正常情况下的字体重量为400,粗体为700。如果lfWeight为0,则使用默认的字体重量。
lfItalic:当lfItalic为TRUE时使用斜体
lfUnderline:当lfUnderline为TRUE时给字体添加下划线
lfStrikeOut:当lfStrikeOut为TRUE时给字体添加删除线
lfCharSet:指定字符集。可以使用下面的预定义值:ANSI_CHARSETOEM_CHARSETSYMBOL_CHARSETUNICODE_CHARSET其中OEM字符集是与操作系统相关的。
lfOutPrecision:指定输出精度。输出精度定义了输出与所要求的字体高度、宽度、字符方向等的接近程度。它可以为下面的值之一:OUT_CHARACTER_PRECISOUT_DEFAULT_PRECISOUT_STRING_PRECISOUT_STROKE_PRECIS
lfClipPrecision:指定剪辑精度。剪辑精度定义了当字符的一部分超过剪辑区域时对字符的剪辑方式,它可以为下列值之一:CLIP_CHARACTER_PRECISCLIP_DEFAULT_PRECISCLIP_STROKE_PRECIS
lfQuality:定义输出质量。输出质量定义了图形设备接口在匹配逻辑字体属性到实际的物理字体的所使用的方式,它可以为下列值之一:DEFAULT_QUALITY (默认质量)DRAFT_QUALITY (草稿质量)PROOF_QUALITY (正稿质量)
lfPitchAndFamily: 指定字体的字符间距和族。最低两位指定字体的字符间距为以下值之一:DEFAULT_PITCHFIXED_PITCHVARIABLE_PITCH第4到7位指定字体族为以下值之一:FF_DECORATIVEFF_DONTCAREFF_MODERNFF_ROMANFF_SCRIPTFF_SWISS这些值的具体含义可以参考Visual C++中关于结构LOGFONT的文档。字符间距和字体族可以使用逻辑或(OR)运算符来进行组合。 lfFaceName: 一个指定以NULL结尾的字符串的指针,它指定的所用的字体名。该字符串的长度不得超过32个字符,如果lfFaceName为NULL,图形设备接口将使用默认的字体名。
加载字体
AddFontResource("c:/XX.ttf");
这个函数在你的函数中只要调用一次就行了,这时系统的字体表中会增加该字体,注意这时加载的这个字体,在其他应用程序中也会看到,所以记得要在退出程序调用RemoveFontResource("c:/XX.ttf");
否则该字体会一直驻留在系统当前加载的字体表中。
如果你不想让其他应用程序在你加载了该字体文件后也能使用该字体,可以使用AddFontResourceEx()当然对应的也有RemoveFontResource()函数。