私の目的: 特定の高さの IDWriteTextLayout に収まるテキストの行数を計算できるように、IDWriteTextFormat のフォントの高さを取得したいと考えています。
私の問題: 現在、このコードを使用して表示可能な行数を計算しています:
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++ を使用して行われています。