したがって、文字列にスペースがある場合、または文字列の最後に\ r \ nを入力した場合、drawtextで文字列を分割することができます。ただし、スペースや改行のない長い文字列は、描画長方形を超えて続行され、クリップされます。できればこれを防ぎたいと思います。
drawtextのフォーマットフラグには、これを実現するものは何も目立ちませんでした。何か案は?
実際、これはほとんどの場合、MSDNから必要なものです。
DT_EDITCONTROL
複数行の編集コントロールのテキスト表示特性を複製します。具体的には、平均文字幅はエディットコントロールと同じ方法で計算され、関数は部分的に表示される最後の行を表示しません。
言及されていないのは、編集コントロールのように、必要に応じて途中で単語を分割することです。部分的に表示されたボトムラインを表示しないという他の効果もありますが、十分なスペースがあることを確認するために事前にDT_CALCRECTを使用している可能性があるため、ほとんどの使用法では問題にならないでしょう(そうでない場合は、部分的に描画しないでください)。とにかく目に見える線がおそらく最高です)。それが本当に重要な場合は、DrawTextに高い長方形を与えるなど、クリッピングを使用していつでも何かを行うことができますが、デバイスコンテキストには小さなクリップ長方形がすでに設定されています。
通常DT_WORDBREAK
はフラグを使用します。MSDNのDrawTextドキュメントから、これは次のとおりです。
言葉を壊します。単語がlpRectパラメーターで指定された長方形の端を超えて伸びる場合、単語間で行が自動的に分割されます。キャリッジリターンラインのフィードシーケンスもラインを中断します。
これが指定されていない場合、出力は1行になります。
ただし、壊れない行が1つあります。つまり、単語はありません。 あなたは自分で休憩の世話をする必要があります。 これは2つの方法で解決できます。
DrawText
withを使用しDT_CALCRECT
て、長方形のサイズを計算します-ループ、最初の行の文字列が見つかるまで文字列を短くしてから、残りの文字列について繰り返します。つまり、描画領域の幅に水平方向に収まるインデックス0-nからサブセットを見つけます。再び水平に収まるn+1-mからの文字列を見つけます。文字列の終わりに達するまで繰り返します。これらのサブストリングを\r\n
それぞれの間に連結して手動ブレークを強制し、で描画するDrawText
と正しくラップされます。
構造体DrawTextEx
へのポインタを使用して渡します。「空白文字を含む、DrawTextExによって処理される文字数。この数は、文字列の長さ、または描画領域の下にある最初の行のインデックスにすることができます」DRAWTEXTPARAMS
というメンバーがあります。渡してはuiLengthDrawn
いけませんDT_NOCLIP
。これはおそらく(テストせずに)ループのない最初の方法とほぼ同じ情報を提供するように機能します。不確かなのは、描画領域の「下」というフレーズです。線が途切れない場合は、テキスト全体を処理しました。
最初の方法は常に機能し、私が自分のリッチテキスト処理に使用する方法の単純なバージョンです。