2

IDWriteTextLayout を取得してレイアウトを調整し、グリフがレイアウト境界からはみ出さないようにする方法を知っている人はいますか? これは、LHS または RHS に揃えられている場合に、一部のフォントの「f」などの斜体で特に問題になります。

デフォルトでは、GDI+ はこのように動作します (参照: StringformatFlagsNoFitBlackBox)。1 つのオプションは、カスタム レイアウトを実装することです..しかし、それは非常に複雑に思えます。可能であれば、標準のレイアウトを使用したいと思います。

4

2 に答える 2

0

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);
于 2013-09-21T00:27:01.377 に答える