设备环境定义了再定义TextOut时Windows使用的字体。默认的字体成为系统字体或者SYSTEM_FONT。系统字体是标题栏、菜单栏、对话框使用的默认字体。在早期的Windows系统中系统字体是一种等宽字体:所有字符的宽度都是相同的。从Windows3.0开始系统字体变成了变宽字体:每个字符的宽度不一样。系统字体是一种“点阵字体”:每个字符由像素点构成。在某种程度上,系统中字符的大小取决于显示器的大小(分辨率):系统设计要求能够在显示器上显示25行80列的字符。
为了让TextOut显示多行文本,必须知道字符的尺寸。由字符的高度可以知道下一行的垂直位置,由字符的宽度可以知道下一列的水平位置。系统字符的尺寸是多少,这个问题没有一个确切的答案,或者说不是一个常量,而是一个与显示器的当前分辨率,当前系统字体有关的函数。
程序员可以通过GetSystemMetrics来获取用户界面的尺寸(分辨率),同样可以通过GetTextMetrics来获取字符的尺寸。GetTextMetrics(同样
GetSystemMetrics 也是一个兼容函数)以ASCII版本为例的函数原型如下:
BOOL WINAPI GetTextMetricsA(HDC, LPTEXTMETRICA);
第一个参数是一个设备环境句柄,第二个参数是一个指向TEXTMETRICA结构的指针。调用该函数windows会自动填充TEXTMETRICA结构的每个成员,TEXTMETRICA定义如下:
typedef struct tagTEXTMETRICA
{
LONG tmHeight;
LONG tmAscent;
LONG tmDescent;
LONG tmInternalLeading;
LONG tmExternalLeading;
LONG tmAveCharWidth;
LONG tmMaxCharWidth;
LONG tmWeight;
LONG tmOverhang;
LONG tmDigitizedAspectX;
LONG tmDigitizedAspectY;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
} TEXTMETRICA, *PTEXTMETRICA, NEAR *NPTEXTMETRICA, FAR *LPTEXTMETRICA;
该结构的每个成员的单位取决于当前设备环境的映射模式,默认的映射模式是MM_TEXT以像素为单位。结构中总共与20个成员,我们只关心前7个如下图所示:

GetSystemMetrics可以获取包括75种的系统尺寸信息,详见Windows.h头文件