如何在 DirectWrite 中为倾斜字体获取正确的文本宽度?

Posted

技术标签:

【中文标题】如何在 DirectWrite 中为倾斜字体获取正确的文本宽度?【英文标题】:How to get correct text width for oblique font in DirectWrite? 【发布时间】:2017-02-12 16:39:46 【问题描述】:

我通过以下代码创建了一个IDWriteTextLayout对象,

    hr = g_pDWriteFactory->CreateTextLayout(text, textLength, *g_pTextFormat, 200000000, 200000000, g_pTextLayout);

然后通过文本度量获取文本宽度,

    DWRITE_TEXT_METRICS dtm;
    pTextLayout->GetMetrics(&dtm);
    float minHeight = dtm.height;
    float minWidth = dtm.widthIncludingTrailingWhitespace;

让我困惑的是,无论字体的样式是DWRITE_FONT_STYLE_OBLIQUE 还是DWRITE_FONT_STYLE_NORMAL,同一个字符串的宽度都是同一个值。为什么?我希望当字体样式为 DWRITE_FONT_STYLE_OBLIQUE 时,宽度应该更大。我怎样才能获得倾斜文本的正确宽度?

谢谢。

【问题讨论】:

【参考方案1】:

布局指标基于字体设计指标,无论是否暗示,而不是每个字形的实际墨盒。如果您希望指标与生成的渲染位图大小更匹配,您可以使用数据GetOverhangMetrics() 返回来调整返回的布局指标。但最终知道结果布局的确切像素大小的唯一方法是渲染它。

因此,回答您的问题,返回的倾斜字体布局指标已经正确,它们的含义与您的预期略有不同。

【讨论】:

以上是关于如何在 DirectWrite 中为倾斜字体获取正确的文本宽度?的主要内容,如果未能解决你的问题,请参考以下文章

DirectWrite (CreateTextFormat) 如何选择后备字体?

360极速浏览器,关闭“开启DirectWrite高清字体渲染支持”导致内置打印崩溃

360极速浏览器,关闭“开启DirectWrite高清字体渲染支持”导致内置打印崩溃

uwp 获取系统字体库

Chrome 字体模糊解决

DirectWrite GDI 互操作:使用“IDWriteFontFace”绘制文本的简单方法