6

シンプルな wysiwyg テキスト エディターと同等の、テキスト レンダリングを行う ac# アプリケーションがあります。

TextRenderer.DrawText を使用してテキストを画面にレンダリングし、GetTextExtentPoint32 を使用してテキストを測定しているため、同じ行にさまざまなフォント スタイル/サイズを配置できます。

Vista では、これで問題なく動作します。ただし、XP では、Arial のレンダリングが異なります。「o」や「b」などの特定の文字は、Vista よりも幅が広くなります。GetTextExtentPoint32 は、Vista と同じように文字列を測定しているようですが、幅が狭くなっています。最終的な結果として、前のテキストが実際の画面上のサイズよりも小さく測定されるため、テキストの実行がその前のテキストと重なることがあります。

また、私のテキスト レンダリング コードは ie のテキスト レンダリングを正確に模倣しており (単純な書式設定と英語のみ)、テキスト レンダリングは vista と xp の間で一貫しているようです。

何が起こっているかについて何か考えがある人はいますか?

つまり、TextRenderer.DrawText と GetTextExtentPoint32 は、Arial の XP では一致しません。DrawText は特定の文字を Vista よりも大きくまたは小さく描画するようですが、GetTextExtentPoint32 は Vista と同じようにテキストを測定しているようです (つまり、XP と Vista の両方でのテキスト レンダリングと一致するようです)。それが理にかなっていることを願っています。

注: 残念ながら、 TextRenderer.MeasureString は私の要件を満たすほど高速でも正確でもありません。私はそれを使用しようとしましたが、それを引き裂かなければなりませんでした。

4

3 に答える 3

2

エイドリアンに返信していただきありがとうございます。

私の理解では、TextRenderer.DrawText は実際には GDI への呼び出しをラップし、GDI+ テキスト レンダリングを完全にバイパスします。そのため、GetTextExtentPoint32 が出力に反応しないことに戸惑いました。

私は問題を見つけたと思います。Graphics.TextRenderingHint を System.Drawing.Text.TextRenderingHint.ClearTypeGridFit に設定するか、場合によっては他の値に設定すると、一部のフォントの一部の文字のサイズが増減します。これは、Vista よりも XP に当てはまるようです。Vista ではまったく発生していません。とにかく、 GetTextExtentPoint32 が違いを認識できないか、呼び出し時に何らかのフラグを設定していないようです。

私の解決策は、システムのデフォルトの textrenderinghint 設定を使用することです。

于 2010-04-08T20:22:57.457 に答える
1

実際には TextRenderer の DrawText と MeasureString の両方がDrawTextExに基づいています(これは Gdi 関数ではなく User32 です)。そのため、MeauseString の代わりにこの関数へのネイティブ マーシャリング呼び出しを使用することを検討できます。これは、いくつかの追加の計算を行うためです (特に、HDC なしで関数オーバーライドを使用している場合)。

また、この投稿も役立つかもしれません。

于 2010-04-09T12:08:49.927 に答える
0

私は C# の専門家ではありませんが、.NET レンダリングは GDI+ の上に構築されていると思います。また、GDI+ がヒントなしのスケーリングを使用する独自のフォント レンダリングを行うことも確信しています。

GetTextExtentPoint32一方、GDI の一部です。GDI はサイズ変更のヒントを使用します。これは、フォント サイズに応じて文字の幅に影響を与える可能性があります。一般に、小さいサイズの GDI テキストは少しゲッターに見えますが、線形にスケーリングしません。

ピクセル パーフェクトな結果を得るには、いずれかのモデルを一貫して使用する必要があります。

これが Vista よりも XP でより明白になる要因は他にもあるかもしれませんが、根本的な問題はどちらにも存在します。これらの他の要因には、DPI 設定、DPI スケーリング、ClearType またはアンチエイリアス設定、フォント リンク (他のアルファベットのスクリプトを混在させる場合)、フォントの置換 (特に印刷時)、さらには異なるバージョンの Arial などがあります。GDI+ が GDI と同じデフォルトのマッピング モードを使用しているかどうかさえ定かではありません。

print preview に関する私の回答も参照してください。

于 2010-04-08T19:36:42.560 に答える