我在 Direct2D/DirectWrite 中呈现文本,但调用SetLineSpacing()
TextFormat 或 TextLayout 似乎没有效果。有谁知道为什么?
6 回答
我 99% 确定这是一个错误。我最近在 Direct2D 上玩了一些,并且SetLineSpacing()
在 TextLayout 上也遇到了问题,认为它与您所描述的相同,在这种情况下,我可以确认它不仅仅是您。在 MS Connect 上重新打开您的错误报告,它已被关闭。
我什至遇到了与 Dmitri Nesteruk 所说的相同的问题。
但是,我发现如果您在“CreateTextLayout”之后设置 lineSpacing,SetLineSpacing 将无法工作。
否则,如果您在 CreateTextLayout 之前设置 LineSpacing,它现在可以工作。
也许你可以试试这个解决方案。
PS:我的环境。在 Window Vista SP2 中。
非常感谢。
不幸的是,您没有提供显示您正在尝试做什么的代码。我假设您正在尝试像这样设置行距:
pTextLayout->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, lineSpacing, baseline);
MSDN 上的文档对不同的行距方法不是很清楚。默认方法导致每行的间距从使用的字体和内联对象(如果有)派生,因此每行是根据其内容需要的高度。在这种情况下,两个参数lineSpacing
和baseline
被忽略。
如果您的文本格式使用单一字体(和字体大小)并且没有内联对象(或不高于文本的内联对象),则可以指定统一的行距。这就是DWRITE_LINE_SPACING_METHOD_UNIFORM
它的用途。我刚刚尝试过,SetLineSpacing()
使用此方法调用会根据传递的参数产生统一的行距。
从 Windows 10 开始,有第三种行距方法 ,DWRITE_LINE_SPACING_METHOD_PROPORTIONAL
可用于实现与字体大小和内联对象指定的行距相关的行距。但是,这仅在 Windows 10 上受支持。
以我的经验,最具误导性的部分是调用SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, x, y)
成功而没有错误,然后使用该GetLineSpacing()
方法检索行间距参数,返回提供的值(虽然它们仍然没有实现任何东西)。API 在这方面是内部一致的,不会丢弃指定的值,即使它们没有实现任何有用的功能。此外,当您调用GetLineSpacing()
新创建的IDWriteTextFormat
或IDWriteTextLayout
实例时,这些值将返回为零(这是正确的,因为行距方法是DWRITE_LINE_SPACING_METHOD_DEFAULT
)。为了能够做任何有用的事情,您必须确定您正在使用的字体的默认行距。您可以通过调用IDWriteFont::GetMetrics()
您正在使用的字体来实现这一点。默认行距是ascent
,descent
和lineGap
价值观。
Charles Petzold 在一篇关于Pagination With DirectWrite的文章中写到了这一点。
我错过了什么吗?
IDWriteTextFormat和IDWriteTextLayout都没有SetLineHeight函数......
你检查过HRESULT
返回的错误代码SetLineSpacing()
吗?
提示:如果您使用的是 Visual Studio,只需eax,hr
在其中一个调试监视窗口中输入,即可在调用后立即查看任何可能的错误代码。
支持的最低客户端:Windows 7、带有 SP2 的 Windows Vista 和适用于 Windows Vista 的平台更新。
您是否运行上述任何版本的 Windows?我相信您没有看到任何更改的原因是因为低于上述状态的任何版本都不支持 DirectWrite 中的 SetLineSpacing()。