0

指定された長方形内にテキストを描画するために単純なコードを使用しています。グラフィックスのスケール (Graphics.ScaleTransform メソッドで設定) によってテキストのレイアウトが異なる場合があることを除いて、すべて正常に動作します。

問題を言葉で説明するのは難しいので、例の画像を見てください

  1. ScaleTransform を約 0.3 に設定 - テキストは指定された長方形内の 1 行に収まります。
  2. ScaleTransform を約 0.6 に設定 - テキストは最後の単語の前で折り返されます。

どちらの場合も、フォント、テキスト、レイアウト四角形、StringFormatting などは同じです。変わるのはスケールだけです。「フォントのスケーリング」を使用していないことに注意してください。どちらの場合も、同じフォント オブジェクトです。StringFormatFlags が設定されていません。

どうすれば修正できますか?テキストが折り返されるかどうかは気にしません。一貫性が必要なだけです。スケールに関係なく、常にラップされているかどうかに関係なく。どうやってするか?

4

1 に答える 1

2

Hans からの手がかりのおかげで、考えられる解決策はorに設定Graphics.TextRenderingHintすることです。しかし、アンチエイリアシングはなく、テキストは醜く見えます (2 番目の例のように)。SingleBitPerPixelSingleBitPerPixelGridFit

GraphicsPath残念ながら、テキストは後で変換され、結果は常にサンプル画像に示されている2番目のもののようになるため、これは私の問題を解決しません。ただし、この問題には別の解決策がありますGraphicsPath。最初にテキストを変換してから描画します。

ただし、考えられる問題がいくつかあります。

  1. GraphicsPath全体的なオーバーヘッドが最小限になるように、テキストが変更された場合にのみ が更新されるようにしてください。
  2. テキストの変更中にオーバーヘッドが大幅に増加することに注意してください。ただし、これは、WYSIWYG アプリのように、ユーザー入力中にテキストを継続的に表示している場合にのみ重要です。テキスト入力中のGraphicsPathキーストロークごとに を再作成する必要があります。これは、深刻なパフォーマンスのボトルネックになる可能性があります。マイレージは異なる場合があるため、必ずターゲット構成をテストしてください。
  3. Graphics.SmoothingMode滑らかな曲線を得るには、に設定する必要がありますAntiAlias(またはHighQuality どちらも同じです) - パフォーマンスに影響を与える可能性のあるもう 1 つのことです。

最も興味深い部分は、テキストを変換したソリューションが従来の方法GraphicsPathより優れていることです。Graphics.DrawStringまた、フォント自体が重要な要素であることにも注意してください。凝った形の文字を含む複雑なフォントは、より多くの曲線ポイントを使用するため、描画に多くの CPU 時間を必要とします。

私のテスト中に、文字列が数千文字を超えると目に見える速度低下に気付きました (i5 760 CPU、描画する大きな GraphicsPath は 1 つだけです)。

于 2012-04-11T15:39:43.723 に答える