5

次のように TextRenderer.MeasureText を呼び出します。

TextRenderer.MeasureText(myControl.Text, myControl.Font);

結果をコントロールのサイズと比較して、テキストが収まるかどうかを確認します。結果が正しくない場合があります。次の 2 つの問題が確認されました。

  • 多くの場合、Label が AutoSize に設定されている場合、TextRenderer は Control の自動サイズ調整された幅よりも 1 ピクセル広い幅を報告します。
  • TextRenderer がコントロールの幅よりも小さい幅を報告しているが、テキストがまだ途切れている場合の偽陰性。これは "Estación de trabajo" で発生しました -- アクセントが幅の計算に何らかの影響を与える可能性があるかどうかわかりませんか?

MeasureText メソッドの精度を向上させる方法はありますか? デバイス コンテキストやフォーマット フラグを受け入れるオーバーライドの 1 つを呼び出す必要がありますか?

4

4 に答える 4

8

私はそれがおそらくもう実際のものではないことを知っています。ただし、将来の読者のために、コントロール内のテキストを測定する簡単で正確な方法を次に示します。

Graphics g=Graphics.FromHwnd(YOUR CONTROL HERE.Handle);
SizeF s=g.MeasureString("YOUR STRING HERE", Font, NULL, NULL, STRING LENGTH HERE, 1)
于 2011-03-10T11:08:20.073 に答える
6

MeasureText メソッドの精度を向上させる方法はありますか? デバイス コンテキストやフォーマット フラグを受け入れるオーバーライドの 1 つを呼び出す必要がありますか?

あなたはあなた自身であなたの質問に答えました。実際には、Win32 DrawTextEx に基づく MeasureText であり、この関数は有効なデバイス コンテキストがないと機能しません。したがって、hdc を使用せずに MeasureText オーバーライドを呼び出すと、内部的にデスクトップ互換の hdc が作成されて測定が行われます。

もちろん、測定は追加の TextFormatFlags に依存します。また、ラベルの描画 (および測定) はUseCompatibleTextRenderingに依存することに注意してください。

したがって、一般的な結論として、独自のコードに MeasureText を使用する必要があります。たとえば、まったく同じパラメーターで DrawText を呼び出す場合、それ以外の場合はすべて、MeasureText によって返されるサイズを正確なものとして扱うことはできません。

予想されるラベル サイズを取得する必要がある場合は、GetPreferredSizeメソッドを使用する必要があります。

于 2009-07-06T14:23:24.567 に答える
3

この関数の TextFormatFlags パラメータを確認してください。

TextRenderer::MeasureText(String, Font, Size, TextFormatFlags) 

http://msdn.microsoft.com/en-us/library/8wafk2kt.aspx

「指定されたフォントで 1 行に描画されるテキストのサイズ (ピクセル単位)。TextFormatFlags パラメーターを受け取る DrawText オーバーロードの 1 つを使用して、テキストの描画方法を操作できます。たとえば、TextRenderer の既定の動作は次のとおりです。オーバーハングしたグリフに対応するために、描画されたテキストの境界四角形にパディングを追加します. これらの余分なスペースなしでテキストの行を描画する必要がある場合は、Size および TextFormatFlags パラメータを取るバージョンの DrawText および MeasureText を使用する必要があります. たとえば, MeasureText(IDeviceContext, String, Font, Size, TextFormatFlags) を参照してください。」

h番目

于 2009-12-18T11:35:48.373 に答える
1

完璧な解決策があるかどうかはわかりませんが、数年前に WinForms を行っていたときにこれに遭遇しました。最終的に補正した方法は、返された測定値をパーセンテージで調整することでした。何を使用したか (5% か 105 か?) は思い出せませんが、アプリ全体で一定のパーセンテージを使用し、常に切り上げられたことは覚えています。

于 2009-07-06T14:17:14.903 に答える