第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] :系统字体与字符大小

回到目录

下一篇:无

相关推荐
【ql君】qlexcel2 分钟前
Visual Studio Code的使用,VS code常用扩展
ide·vscode·编辑器·visual studio·扩展
Tanecious.9 分钟前
蓝桥杯备赛:Day6-B-小紫的劣势博弈 (牛客周赛 Round 85)
c++·蓝桥杯
流云鹤16 分钟前
Codeforces Round 1090 (Div. 4)
c++·算法
小菜鸡桃蛋狗17 分钟前
C++——string(上)
开发语言·c++
wljy124 分钟前
第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯·stl
清空mega1 小时前
C++中关于数学的一些语法回忆(2)
开发语言·c++·算法
想唱rap1 小时前
线程池以及读写问题
服务器·数据库·c++·mysql·ubuntu
望眼欲穿的程序猿2 小时前
Vscode Clangd 无法索引 C++17 或者以上标准
java·c++·vscode
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
Felven2 小时前
B. Promo
c语言