第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++ 数据结构复习笔记
数据结构·c++·笔记
tntxia2 小时前
C++ 基础教程:从入门到精通
c++
Drone_xjw2 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
熊猫_豆豆5 小时前
QT6 Android C++ 自制美观闹钟
android·c++·qt·闹钟
随意起个昵称6 小时前
状压dp-基础题目2([USACO12MAR] Cows in a Skyscraper G)
c++·算法·动态规划
无限的鲜花7 小时前
协程本质是函数加状态机——零基础深入浅出 C++20 协程
c++·算法·c++20
精明的身影7 小时前
C++自学之路1:Hello world
开发语言·c++
旖-旎8 小时前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
森林古猿18 小时前
再论斜率优化
c++·学习·算法
水利行业RTU手艺人8 小时前
RTU固件中的“数据保险箱”——离线数据补发系统设计
c++·stm32·单片机·物联网