第4章,[标签 Win32] :文本尺寸的度量

专栏导航

上一篇:第4章,[标签 Win32] :系统字体与字符大小

回到目录

下一篇:无

本节前言

对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点,请你自行查阅。

我呢,也会提到一部分的参考课节。但是呢,你不应该依赖于我的主动提及。最好呢,你自己能够多去了解和查看本专栏目录。

本节内容,来自对佩措尔德教材内容的大段抄录。

我们开始。

一. 本节正文

在 TEXTMETRICS 结构中有设备环境中当前字体的各种信息。但字体的纵向尺寸仅由其中的 5 项决定。下面的图片,演示了其中的 4 项。
图1

图1 展示的是 640 * 480 分辨率条件下的默认系统字体的情况。图1 中,演示的是带有重音符号的 A 和 q 两个字符的像素显示情形。

在图1 里面,从下往上数,第 3 行像素方格的上边所在的直线,为基线。

了解了基线的情况之后,我们再来说字体尺寸中最重要的一个概念, tmHeight,它是 tmAscent 和 tmDescent 的和。这两个值分别是字符在基线之上和基线之下的最大高度。

间距(leading),是两行文字之间的空间。在 TEXTMETRICS 结构里,内部间距(tmInternalLeading)包含在 tmAscent 中(也就是,包括在 tmHeight 中),该间距通常被用于显示重音符号。tmInternalLeading 的值可以被设置为 0,在这种情况下,带重音符号的字符会稍微短一点,以便把重音符号包含在内。

TEXTMETRICS 结构的另一个字段是 tmExternalLeading,它并不包含在 tmHeight 的值里。该字段是字体设计者建议在两行文字间留出的空间大小。在显示多行文字时,可以选择接受或者不理会这个建议。在我最近使用的系统字体中,这个值是 0 。这就是为什么,在图1 中没有标出这个字段的原因。

TEXTMETRICS 结构中有两个字段描述了字符的宽度:tmAveCharWidth 是小写字符的加权平均宽度,tmMaxCharWidth 是字体中最宽的字符的宽度。在等宽字体中,这两个值是一样的。在图1 所示的字体中,这两个值分别是 7 和 14 。

在本章的范例程序中,还有另一种字符宽度:大写字符的平均宽度。该值大小通常可以按 tmAveCharWidth 的 1.5 倍进行计算。

值得重视的是,系统字体的尺寸取决于 Windows 运行时的显示分辨率,有时还取决于用户选定的系统字号。Windows 提供了与设备无关的图形界面,但程序员也需要注意:不要在 Windows 应用程序里猜测文本的尺寸,不要使用固定的值,应该通过调用 GetTextMetrics 函数来获取这些信息。

示例图说明

本节所说的图片,其中的红色方格与点阵字体图画部分,是我用 MFC 编写出来的。在我用 MFC 画出了红色方格与点阵字体图画之后,又通过截图,将其保存下来,然后在 PhotoShop 里面导入这个截图,然后我去手动绘制了各个字段的标注线与标注文字,就形成了图1 的完整图片。尽管和佩措尔德教材的图片区别不大,但是,它的确是我自己画出来的。

这个图片,我想,我们用不着学习到 MFC 章节的时候,应该就可以将其绘制出来了。这个图,以我目前的能力,用 Windows API 程序,是可以将其画出来的。

到时候,学会了相关的基础知识以后,我会领着大家,来尝试着将这个图给画出来的。

总 结

本节,我认为,它还是很有意思的。多看看,你应该能理解的。

专栏导航

上一篇:第4章,[标签 Win32] :系统字体与字符大小

回到目录

下一篇:无

相关推荐
三品吉他手会点灯17 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
x***r15117 小时前
node-v0.12.2-x86安装步骤详解(附Node.js历史版本与32位配置教程)
windows
小小小米粒18 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
蜡台18 小时前
Python包管理工具pip完全指南-----2
linux·windows·python
智者知已应修善业18 小时前
【51单片机中的打飞机设计】2023-8-25
c++·经验分享·笔记·算法·51单片机
智者知已应修善业20 小时前
【51单片机按键调节占空比3位数码管显示】2023-8-24
c++·经验分享·笔记·算法·51单片机
JasmineX-121 小时前
数据结构(笔记)——双向链表
c语言·数据结构·笔记·链表
徐某人..1 天前
基于i.MX6ULL平台的智能网关系统开发
arm开发·c++·单片机·qt·物联网·学习·arm
无敌秋1 天前
# C++ 简单工厂模式实战指南
c++·简单工厂模式