GDI字体分3类:点阵字体(raster font)、笔画字体(stroke font)和Truetype字体。
默认点阵字体有7种:
System (用于SYSTEM_FONT) 无衬线 西方
有衬线 gb2312
Fixedsys (用于SYSTEM_FIXED_FONT) 有衬线 gb2312
Terminal (用于OEM_FIXED_FONT) 有衬线 gb2312
无衬线 OEM/DOS
无衬线 韩文
Courier 有衬线 西方
MS Serif 有衬线 西方
MS Sans Serif (用于DEFAULT_GUI_FONT) 无衬线 西方
Small Fonts 无衬线 西方
默认笔画字体有3种:
Modern 无衬线 OEM/DOS
Roman 有衬线 OEM/DOS
Script 有衬线 OEM/DOS
默认TrueType字体有13种:
Courier New Arial
Courier New Bold Arial Bold
Courier New Italic Arial Italic
Courier New Bold Italic Arial Bold Italic
Times New Roman Symbol
Times New Roman Bold
Times New Roman Italic
Times New Roman Bold Italic
System本身就是粗体,还有粗斜体。
Arial是无衬线,其他12种TrueType字体都是有衬线。
在TrueType字体中可能只有Arial Unicode MS支持东方语言。比如简体中文、繁体中文、韩文。
在范例代码里面用库存字体SYSTEM_FIXED_FONT得到的是Fixedsys。而默认的SYSTEM_FONT是System。使用OEM_FIXED_FONT得到的是Terminal。
void CMainWindow::OnPaint()
{
CPaintDC dc(this);
dc.SelectStockObject(SYSTEM_FIXED_FONT);
//dc.SelectStockObject(OEM_FIXED_FONT);
dc.GetTextFace(strTextFace);
dc.TextOut(10,10,"SYSTEM_FIXED_FONT");
//dc.TextOut(10,10,"SYSTEM_FONT");
//dc.TextOut(10,10,"OEM_FIXED_FONT");
dc.TextOut(10,30,strTextFace);
dc.GetTextMetrics(&tm);
//别的代码
}
建立逻辑字体一般用CreateFont函数和CreateFontIndirect函数。这2个函数声明如下:
BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename ); | 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, *PLOGFONT; |
BOOL CreateFontIndirect(const LOGFONT* lpLogFont); |
从以上声明看到CreateFontIndirect函数其实是CreateFont函数的简化。直接参数转换成结构。下面用CreateFont函数版本来解释需要的参数。
nHeight参数“这是以逻辑单位表示希望得到的字符高度。”有3种可能的值:
①大于0。高度被转换为设备单位。“它和TEXTMETRIC结构的tmHeight字段值近似相等(有时会有微小的不同,那是由于四舍五入带来的误差)”。“它表示该高度包含内部间隔tmInternalLeading(但不包含外部间隔tmExternalLeading)”。
②等于0。“默认字符高度”、“使用合理的缺省值”。
③小于0。负数。“它大致等于TEXTMETRIC结构的tmHeight字段减去tmInternalLeading”。“当它为负数时,Windows会将其绝对值作为字体的高度。这是一个很重要的区别:如果想要某一特定字号的字体,应该先把该字号转换成逻辑单位,然后把nHeight设定为该值的相反数,Windows就会反向查找到你想要的字号。”
下图介绍tmHeight、tmAscent、tmInternalLeading、tmExternalLeading的含义。
上图截图自《Windows程序设计(第5版,珍藏版)》(美)Charles Petzold著。里面的第73页。
tmExternalLeading并没有在上图中。具体可见第776页的“17.2.5行间距和字间距”这一节。
nWidth参数“这是以逻辑单位表示希望得到的字符宽度。”
nEscapement参数表示字符串水平基线逆时针偏离角度大小。以0.1°为单位。
nOrientation参数表示单个字符水平基线逆时针偏离角度大小。以0.1°为单位。
nWeight表示宽度。大部分都是400。System本身就是黑体,所以是700。
bItalic表示是否是斜体。
bUnderline表示是否有下划线。
bStrikeOut表示是否有删除线。
nCharSet表示字符集。
nOutPrecision表示输出精度。
nClipPrecision表示剪切精度。
nQuality表示字体输出质量。
nPitchAndFamily表示是否变宽等宽字体和字形集。
lpszFacename表示字样名称。