SetLineSpacing()在DirectWrite中不起作用 - 为什么?

时间:2009-11-03 08:10:59

标签: c++ direct2d directwrite

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

我甚至和Dmitri Nesteruk说的有同样的问题。

但是,我发现如果你在之后设置了lineSpacing CreateTextLayout“,SetLineSpacing无法正常工作。

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

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

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

非常感谢。

答案 2 :(得分:2)

很遗憾,您不会提供显示您尝试执行的操作的代码。我假设你正试图像这样设置行间距:

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()方法检索行间距参数,返回提供的值(同时他们仍然没有做任何事情)。在这方面,API在内部是一致的,即使它们没有实现任何有用的功能,也不会丢弃指定的值。此外,当您在新创建的GetLineSpacing()IDWriteTextFormat实例上调用IDWriteTextLayout时,值将返回为零(这是正确的,因为行间距方法为DWRITE_LINE_SPACING_METHOD_DEFAULT) 。为了能够执行任何有用的操作,您必须确定您正在使用的字体的默认行间距。您可以通过在您使用的字体上调用IDWriteFont::GetMetrics()来实现此目的。默认行间距是ascentdescentlineGap值的总和。

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

答案 3 :(得分:0)

我错过了什么吗?

IDWriteTextFormatIDWriteTextLayout都没有SetLineHeight函数......

答案 4 :(得分:0)

您是否检查了HRESULT返回的SetLineSpacing()错误代码?

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

答案 5 :(得分:-2)

Source

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

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