【问题标题】:Windows/GDI- measure size of a font character (Marlett)Windows/GDI-测量字体字符的大小 (Marlett)
【发布时间】:2016-03-17 05:03:03
【问题描述】:

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

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

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

是否有可能找出一个字符周围的额外间距,以便我可以将“x”放在一个框中?

【问题讨论】:

  • 不要尝试自己渲染。改用DrawThemeBackground,调用GetThemeBackgroundExtent查询所需大小。
  • 字体指标非常复杂。即使您挖掘出字形轮廓,TrueType 提示和像素网格拟合也可能会毁了您的一天。如果您不希望有任何惊喜,那么您应该使用位图。您需要一对夫妇来处理 dpiAwareness。

标签: c++ winapi fonts gdi


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2017-06-14
    • 2023-04-02
    • 2018-07-10
    • 2012-03-11
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多