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

专栏导航

上一篇:Windows 编程基础:窗口坐标系

回到目录

下一篇:无

本节前言

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

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

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

我们开始。

一. 系统字体

设备环境同时还定义了在调用 TextOut 时 Windows 使用的字体。默认的字体称为 "系统字体" 或 SYSTEM_FONT(标识符定义在 WinGdi.h 中)。系统字体是 Windows 在标题栏、菜单和对话框中使用的默认字体。

在早期的 Windows 中,系统字体是一种等宽字体:所有字符的宽度是一样的,就像打字机那样。但是,从 Windows 3.0 开始,系统字体变成了变宽字体:每个字符的宽度是不一样的。例如,字符 "W" 比字符 "i" 要宽。很多相关阅读研究表明,用变宽字体印刷的文章比用等宽字体印刷的可读性更强。其原理是,当字符排列得更紧凑时,眼睛和大脑更容易注意到单词而不仅仅是一个个的字符。可想而知,从等宽字体变到变宽字体导致很多早期的 Windows 程序不再适用,程序员们需要学习使用字体的新技术。

系统字体是一种 "点阵字体" :每个字符由像素点组成。(以后,我们还会学习 TrueType 字体,由轮廓定义字符。)在某种程序上,系统字体中字符的大小取决于显示器的大小:系统字体的设计要求能够在显示器上起码显示 25 行 80 列字符。

二. 字符大小

为了用 TextOut 函数显示多行文本,就需要知道字体中字符的尺寸。由字符的高度可以决定下一行文字的垂直位置,而由字符的平均宽度可以决定下一栏文本的水平位置。

那么系统字体中字符的平均宽度是多少?我不会告诉你,或者说,我不知道。即使我说了,很可能,答案也是错误的。因为这取决于显示器的分辨率。Windows 要求的最低分辨率是 640 * 480 ,但很多用户喜欢 800 * 600 和 1024 * 768 。而且,在这些高一点的分辨率里面,用户还可以选择不同的系统字体的字号。

程序可以通过调用 GetSystemMetrics 函数来获取用户界面的尺寸。同样地,通过调用 GetTextMetrics 函数,程序可以获取字体尺寸。GetTextMetrics 函数需要一个设备环境句柄,因为它会返回该设备环境中当前选定的字体的信息。Windows 将把字符尺寸的各种值复制到类型为 TEXTMETRIC 的结构中。该结构体在 WinGdi.h 中定义,有 20 个字段,但是我们仅关心其中的前 7 个。

复制代码
typedef struct tagTEXTMETRIC {
  LONG  tmHeight;
  LONG  tmAscent;
  LONG  tmDescent;
  LONG  tmInternalLeading;
  LONG  tmExternalLeading;
  LONG  tmAveCharWidth;
  LONG  tmMaxCharWidth;
  【其他字段】
} TEXTMETRIC, *PTEXTMETRIC;

这些字段的值的单位取决于设备环境中当前选定的映射模式。默认的映射模式是 MM_TEXT,所以它们的值是以像素为单位的。

在调用 GetTextMetrics 函数前,首先要定义一个结构体变量,同常命名为 tm 。

TEXTMETRIC tm;

需要获取字号时,首先获取设备环境句柄,然后调用 GetTextMetrics 。

复制代码
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
ReleaseDC(hwnd, hdc);

在这之后就可以检查文字尺寸结构中的值,并保存以后需要使用的部分。

总 结

读一两遍,相信你能看懂的。

专栏导航

上一篇:Windows 编程基础:窗口坐标系

回到目录

下一篇:无

相关推荐
凡人叶枫1 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
CSDN_RTKLIB1 小时前
使用三方库头文件未使用导出符号情景
c++
傻乐u兔2 小时前
C语言进阶————指针3
c语言·开发语言
rainbow68893 小时前
Linux文件描述符与重定向原理
c++
lucky67073 小时前
Windows 上彻底卸载 Node.js
windows·node.js
CodeSheep程序羊3 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
I'mChloe4 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
编程小白20264 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
2的n次方_4 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构
嵌入小生0074 小时前
标准IO---核心函数接口延续(嵌入式Linux)
c语言·vscode·vim·嵌入式·小白·标准io·函数接口