我的目标: 我想获得 IDWriteTextFormat 字体的高度,这样我就可以计算出在某个高度的 IDWriteTextLayout 中可以容纳多少行文本。
我的问题: 现在我正在使用这段代码来计算可见的行数:
inline int kmTextCtrl::GetVisLines() const
{
/* pTextFormat is an IDWriteTextFormat pointer, dpi_y is the desktop's vertical dpi,
and GetHeight() returns the height (in pixels) of the render target. */
float size = (pTextFormat->GetFontSize()/72.0f)*dpi_y;
return (int)(GetHeight()/size);
}
对于某些字体,计算似乎是准确的,但对于任何 TrueType 字体(例如:Courier New、Arial、Times New Roman)都不是。对于这些字体,显示的文本在渲染目标的下垂直边界处被剪裁得很短。
一些上下文: 我正在制作一个文本回滚缓冲区控件,它使用 IDWriteTextLayout 将文本放入控件的呈现目标。我使用 GetVisLines() 的结果来确定要从循环缓冲区(按行将文本存储在 std::strings 中的文本)中的多少行文本拉入布局,并在每次滚动或调整窗口大小时重新创建它。
这是使用“本机”Win32 API C++ 完成的。