【问题标题】:SetLineSpacing() does not work in DirectWrite - why?SetLineSpacing() 在 DirectWrite 中不起作用 - 为什么?
【发布时间】:2010-12-12 13:28:43
【问题描述】:

我在 Direct2D/DirectWrite 中呈现文本,但在 TextFormat 或 TextLayout 上调用 SetLineSpacing() 似乎没有效果。有谁知道为什么?

【问题讨论】:

  • 我发布了那个错误,但我认为在这里问是谨慎的,以防万一我做错了什么。
  • 您的错误报告今天已关闭,因为他们对复制示例的请求没有得到回应 - 您可能希望重新打开它,提供他们需要的示例...
  • 一个代码示例会很棒。在 connect.microsoft.com 上也是如此。你能更新你的q吗?请问?
  • 您是否使用 DWRITE_LINE_SPACING_METHOD_DEFAULT 调用它?根据 MSDN 文档,此模式仅依赖于内容(使用的字体),而不管这两个参数。它是 DWRITE_LINE_SPACING_METHOD_UNIFORM,它利用了 lineSpacing 和基线参数。需要代码sn-p...

标签: c++ direct2d directwrite


【解决方案1】:

我 99% 确定这是一个错误。我最近在 Direct2D 上玩了一点,在 TextLayout 上的 SetLineSpacing() 也有问题,认为它与你所描述的,在这种情况下,我可以确认不仅仅是你。在 MS Connect 上重新打开您的错误报告,它已被关闭。

【讨论】:

  • 我不知道它在 2009 年是否真的不起作用,但至少现在调用 SetLineSpacing() 可以按预期工作。问题是当指定DWRITE_LINE_SPACING_METHOD_DEFAULT 时,这两个浮点值会被忽略,因为它们在这种情况下没有意义。默认行间距是指“从使用的字体和内联对象派生行间距”。有关更多信息,请参阅下面的答案。
【解决方案2】:

我什至遇到了与 Dmitri Nesteruk 所说的相同的问题。

但是,我发现如果你设置 lineSpacing "after CreateTextLayout", SetLineSpacing 不能工作。

否则,如果在 CreateTextLayout 之前设置 LineSpacing, 它现在可以工作了。

也许你可以试试这个解决方案。

PS:我的环境。在 Window Vista SP2 中。

非常感谢。

【讨论】:

    【解决方案3】:

    很遗憾,您没有提供代码来显示您正在尝试做什么。我假设您正在尝试像这样设置行距:

    pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);
    

    MSDN 上的文档对不同的行距方法不是很清楚。默认方法导致每行的间距从使用的字体和内联对象(如果有)派生,因此每行是根据其内容需要的高度。在这种情况下,lineSpacingbaseline 这两个参数将被忽略。

    如果您的文本格式使用单一字体(和字体大小)并且没有内联对象(或不高于文本的内联对象),则可以指定统一的行距。这就是DWRITE_LINE_SPACING_METHOD_UNIFORM 的用途。我刚刚尝试过,使用此方法调用SetLineSpacing() 会根据传递的参数产生统一的行距。

    从 Windows 10 开始,有第三种行距方法DWRITE_LINE_SPACING_METHOD_PROPORTIONAL,可用于实现与字体大小和内联对象指定的行距相关的行距。但是,这仅在 Windows 10 上受支持。

    根据我的经验,最具误导性的部分是调用SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y) 成功而没有错误,然后使用GetLineSpacing() 方法检索行距参数,返回提供的值(虽然它们仍然没有' t实现任何目标)。在这方面,API 内部是一致的,不会丢弃指定的值,即使它们没有实现任何有用的功能。此外,当您在新创建的IDWriteTextFormatIDWriteTextLayout 实例上调用GetLineSpacing() 时,值将返回为零(这是正确的,因为行间距方法是DWRITE_LINE_SPACING_METHOD_DEFAULT)。为了能够做任何有用的事情,您必须确定您正在使用的字体的默认行距。您可以通过在您使用的字体上调用IDWriteFont::GetMetrics() 来实现此目的。默认行距是ascentdescentlineGap 值的总和。

    Charles Petzold 在一篇关于 Pagination With DirectWrite 的文章中提到了这一点。

    【讨论】:

      【解决方案4】:

      我错过了什么吗?

      IDWriteTextFormatIDWriteTextLayout 都没有 SetLineHeight 函数...

      【讨论】:

      • 我的意思是SetLineSpacing(),对不起。
      【解决方案5】:

      您检查过SetLineSpacing()返回的HRESULT错误码吗?

      提示:如果您使用的是 Visual Studio,只需在其中一个调试监视窗口中键入 eax,hr 即可在调用后立即查看任何可能的错误代码。

      【讨论】:

        【解决方案6】:

        Source

        支持的最低客户端:Windows 7、带有 SP2 的 Windows Vista 和适用于 Windows Vista 的平台更新。

        您是否运行上述任何版本的 Windows? 我相信您没有看到任何更改的原因是因为低于上述状态的任何版本都不支持 DirectWrite 中的 SetLineSpacing()。

        【讨论】:

        • 我正在运行它意味着我实际上正在使用受支持的操作系统,在本例中为 2008R2。
        猜你喜欢
        • 1970-01-01
        • 2016-12-31
        • 1970-01-01
        • 2018-11-12
        • 2021-09-14
        • 2019-04-29
        • 2017-07-25
        • 2021-01-29
        相关资源
        最近更新 更多