IDWriteTextLayout は常に、インクではなくグリフのレイアウト境界 (グリフの原点と送り幅) を使用してグリフをレイアウトの範囲に揃えます。つまり、斜体の傾斜や Gabriola のファンシーなスワッシュのような装飾により、インクが外側にこぼれる可能性があります (少なくとも Win7 と 8 では)。 .
独自のカスタム レイアウトを作成する以外に、明示的なマージンを含める (レイアウト サイズをコントロール領域よりも小さくする) か、クリップ領域を拡張して、インクが一部の外にこぼれるようにするのが最善の策だと思います。これが、共通の EDIT コントロールと CSS がデフォルトでパディングを設定する理由の 1 つです。そのパディングを見積もるには、他の UI 設定から派生した固定値、フォント サイズの比率を使用するか、1 回測定して DWRITE_OVERHANG_METRICS を取得し、調整/縮小サイズで 2 回目のサイズ変更を行うことができます。
textLayout->SetMaxWidth(initialMaxWidth);
textLayout->GetOverhangMetrics(OUT &overhangMetrics);
float newSmallerWidth = initialMaxWidth
- std::max(overhangMetrics.left, 0.0f)
- std::max(overhangMetrics.right, 0.0f);
textLayout->SetMaxWidth(newSmallerWidth);