c – DirectWrite:Windows 7上的字符间距

我需要在使用GDI和GDI的现有C代码中转换一些文本到位图渲染例程以使用DirectWrite(需要CFF支持和OTF功能支持).

我是DirectWrite的新手.花了一些时间研究现有功能的迁移和进行原型设计所需的内容,我遇到了一个问题:
我的问题是DirectWrite(开箱即用)不支持字符间距调整(这是现有应用程序的要求),至少在Windows 7上没有.我知道它附带Windows 8,但对此现有的另一个要求应用程序是在Windows 7上运行,不幸的是.

到目前为止,我在研究中发现的方法似乎是实现自定义DirectWrite文本布局,但我没有找到任何关于如何做到这一点的好指南,特别是关于字符间距(文档/示例)关于如何创建自定义文本布局的MSDN对我来说有点模糊.

正如我想的那样,之前必须要做的,在重新发明轮子上花费数天和/或数周的研究和开发之前,有没有人知道DirectWrite文本布局的示例实现,我可以使用自定义字符间距作为起点点或教程?

UPDATE1:不是答案但是 – 我发现IDWriteTextLayout1接口(支持设置字符空间)不仅附带Windows 8,还附带Windows 7上的“Windows 7平台更新SP1”(KB 2670838),因为我可以要求out app正常运行,这解决了我的问题,虽然它没有回答我的问题.

最佳答案 由于比迪烟和换行以及需要调用较低级别的API,自定义布局非常复杂,但样本在这里[
https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711(v=vs.85).aspx].至于字符间距,一旦你从整形过程中返回字形数组(IDWriteTextAnalyzer :: GetGlyphs),只需在所有进度上添加一个delta.在链接的SDK示例中,您将在FlowLayout :: ShapeGlyphRuns中添加一个for循环,以便它在换行和绘制之前发生.

STDMETHODIMP FlowLayout::ShapeGlyphRuns(IDWriteTextAnalyzer* textAnalyzer)
{
...
    hr = ShapeGlyphRun(textAnalyzer, runIndex, glyphStart);
...
    // Add additional character spacing to each trailing edge of each glyph.
    for (auto& advance : glyphAdvances_)
    {
        advance += 5.0f;
    }
...
}

请注意,API ApplyCharacterSpacing也被添加到Windows 8,这比自己手动添加它更强大,因为它考虑了每个群集有多个字形的更复杂的脚本(当然,如果你有那个API,那么你也已经有了IDWriteTextLayout :: SetCharacterSpacing) .

点赞