第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 编程基础:窗口坐标系

回到目录

下一篇:无

相关推荐
学嵌入式的小杨同学3 分钟前
STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
c++·stm32·单片机·嵌入式硬件·mcu·架构·硬件架构
xiaoye-duck13 分钟前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划
ambition2024222 分钟前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法
i建模29 分钟前
在 Windows 中解决 `zig fetch` 的 `TlsInitializationFailed` 错误
windows·zig
Book思议-1 小时前
【数据结构实战】线性表的应用
c语言·数据结构·算法·链表
qq_461489331 小时前
C++与Qt图形开发
开发语言·c++·算法
小菜鸡桃蛋狗2 小时前
C++——类和对象(上)
开发语言·c++
2401_879503412 小时前
C++中的观察者模式变体
开发语言·c++·算法
阿贵---3 小时前
C++中的备忘录模式
开发语言·c++·算法
Drone_xjw3 小时前
Qt 工具箱需求文档
c++·qt·需求文档