c++ - Windows/GDI- 测量字体字符的大小 (Marlett)

标签 c++ winapi fonts gdi

我正在尝试测量字符的大小,但无法得出正确的结果。我们使用带有 DT_CALCRECT 标志的 DrawText 来测量字符串,这似乎工作得很好(公平地说,我们还没有实际测试它的像素完美测量)。

但是我现在正在尝试测量单个字符,Marlett 中的 'x' 符号来绘制一个关闭按钮,但它确实不想告诉我实际大小特点。它告诉我这个角色是 8x8 而实际上是 6x5,然后绘制的角色稍微偏离了我要求的位置。

高度方面,我猜它会返回该字体的字符高度(所有字符都相同,所有字体都相同)。但是对于宽度,它似乎在其中添加了字符间距,这似乎与其他字体无关(在 Arial 中尝试了几个字符)。在 Marlett 中,所有测试的字符似乎都返回相同的宽度。

是否有可能找出字符周围的额外间距是多少,以便我可以将“x”置于框中的中心?

最佳答案

大多数字体在字形的两侧都有一点间距,这样当您将它们排成一行时它们就不会接触。您可能不会想到像 Marlett 这样的特殊符号字体会出现这种情况,但它确实存在。

您可以使用 GetCharABCWidths获得这些空间的近似测量值(有时称为“提前宽度”)。 A 值通常是字形之前的间隙; B 值是字形本身的宽度,C 值是字形之后的空格。但是,这些可能不是精确的测量值,因为它们更多的是让事情看起来正确。像 O 这样的圆形字形可能会溢出到周围的空间中,而 AC 值实际上可以是负数。

制作精良的字体还包含字距调整,使某些字符对之间的间距看起来平衡,但我不希望像 Marlett 这样的特殊符号字体有这些。

根据您的具体需要,您可以测试 B 值是否是字形的精确值以及 A 值是否是适当的偏移量。

Marlett 是一个很酷的 hack,可以处理在各种分辨率下呈现漂亮的控件;它肯定比您仍然可以从 LoadImage 获得的旧 OEM 图像更好用.但现代 UI 通常依赖于代码(如 IIinspectable 建议的主题)和/或自定义位图(如 Hans Passant 建议的)。您最好的选择可能是为了您的既定目的而采用其中一种技术。但我觉得您实际提出的问题值得回答。

关于c++ - Windows/GDI- 测量字体字符的大小 (Marlett),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34220897/

相关文章:

C++对指针的引用

winapi - 下一代 Windows 的主要开发框架是什么?

c++ - 移动窗口时发生堆栈溢出(C++、winapi)

c# - 如何在不闪烁的情况下恢复最小化窗口

css - 导入和使用 google webfont

c++ - 如何将整数数组相乘得到一个数字?

c++ - 将类对象传递给函数(可能通过指针而不是引用)C++

c++ - 查看以月为单位的活年

css - 字体 "Futura"不适用于任何 PC

fonts - CSS3 : Is there a way to alter Font Height?