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

时间:2015-12-11 10:09:25

标签: c++ winapi fonts gdi

我试图衡量一个角色的大小,但我无法得到正确的结果。我们使用带有DT_CALCRECT标志的DrawText来测量字符串,这似乎工作得很好(公平地说,我们实际上没有测试过像素完美测量)。

但是我现在正在尝试衡量一个角色,' x' Marlett 中的符号用于绘制关闭按钮,但它实际上并不想告诉我角色的实际大小。它告诉我,当它真的是6x5时,角色是8x8,然后角色被略微偏离我要求它的位置。

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

是否有可能找出角色周围的额外间距是什么,所以我可以将' x'在一个盒子里?

1 个答案:

答案 0 :(得分:0)

大多数字体在字形的两边都有一点间距,这样当你排列它们时它们就不会碰到。你可能不会想到像Marlett这样的专业符号字体,但它就在那里。

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

制作精良的字体还包含字距调整,以便某些字符对之间的空格看起来平衡,但我不希望像Marlett这样的专业符号字体具有这些字体。

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

Marlett是一个很酷的黑客,可以处理各种分辨率的精美控件渲染;它肯定比你仍然可以从LoadImage获得的旧OEM图像更好。但现代用户界面通常依赖于代码(如主题为IIinspectable建议)和/或自定义位图(如Hans Passant建议的那样)。您最好的选择可能是为了您的既定目的而采用其中一种技术。但我觉得你实际问的问题值得回答。

相关问题