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

回到目录

下一篇:无

相关推荐
dllmayday43 分钟前
Linux 上用终端连接 WiFi
linux·服务器·windows
老花眼猫2 小时前
编制椭圆旋转绘图函数
c语言·经验分享·青少年编程·课程设计
智者知已应修善业2 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8083 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站4 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
iCxhust4 小时前
微机原理实践教程(C语言篇)---A002流水灯
c语言·开发语言·单片机·嵌入式硬件·51单片机·课程设计·微机原理
Morwit4 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen875 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码5 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler015 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法