GDI(图形设备接口)编程(三)系统字体与字符尺寸

设备环境定义了再定义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个如下图所示:

tmHeight指字符高度(不包括两行字符之间的间距),tmAscent表示字符基线以上部分的高度,tmDescent表示字符基线以下部分的高度。tmInternalLeading表示字符内预留的间距包含在tmAscent中(主要用于显示重音符号等)。tmExternalLeading标准两行字符之间的间距,tmAveCharWidth表示(小写)字符的加权平均宽度,tmMaxCharWidth表示字符的最大宽宽度。大写字符的平均宽度通常是字符平均宽度的1.5倍。tmPitchFamily的低位表示字符是变宽字符还是等宽字符。1表示变宽字符,0表示等宽字符。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值