WindowsClient.netから:
GDI +は、表示されるすべての文字列の両端に少量(1/6 em)を追加します。この1/6emは、端が張り出したグリフ(斜体の「f」など)を可能にし、GDI+にグリッドフィッティングの拡張を支援するためのわずかな余裕を与えます。
のデフォルトのアクションは、DrawString
隣接する実行を表示する際に機能します。
- まず、デフォルトのStringFormatは、各出力の両端に1/6emを追加します。
- 第二に、グリッドに取り付けられた幅が設計よりも小さい場合、ストリングは最大emまで収縮することができます。
これらの問題を回避するには:
- 常に、活版印刷のStringFormat()に基づいてStringFormatを
MeasureString
渡します。
グラフィックをに設定します。このレンダリング方法では、アンチエイリアシングとサブピクセルグリフポジショニングを使用してグリッドフィッティングの必要性を回避するため、本質的に解像度に依存しません。DrawString
GenericTypographic
TextRenderingHint
TextRenderingHintAntiAlias
.NETでテキストを描画する方法は2つあります。
- GDI +(
graphics.MeasureString
およびgraphics.DrawString
)
- GDI(
TextRenderer.MeasureText
およびTextRenderer.DrawText
)
Michael Kaplan(rip)の優れたブログSorting It All Outから、.NET 1.1では、すべてがテキストレンダリングにGDI+を使用していました。しかし、いくつかの問題がありました:
- GDI +のステートレスな性質によって引き起こされるパフォーマンスの問題がいくつかあります。この場合、デバイスコンテキストが設定され、呼び出しごとに元のコンテキストが復元されます。
- 国際テキストのシェーピングエンジンは、Windows / UniscribeおよびAvalon(Windows Presentation Foundation)で何度も更新されていますが、GDI +では更新されていないため、新しい言語の国際レンダリングサポートの品質は同じではありません。
そのため、 GDI +のテキストレンダリングシステムの使用を停止し、GDIを使用するように.NETFrameworkを変更したいと考えていました。最初、彼らは単に変更できることを望んでいました。
graphics.DrawString
DrawText
GDI+の代わりに古いAPIを呼び出す。しかし、GDI +とまったく同じように、テキストの折り返しと間隔を一致させることはできませんでした。graphics.DrawString
そのため、彼らはGDI +に電話をかけ続けることを余儀なくされました(互換性の理由。電話をかけていた人々graphics.DrawString
は、突然、テキストが以前のように折り返されていなかったことに気付くでしょう)。
GDIテキストレンダリングをラップするために、新しい静的TextRenderer
クラスが作成されました。2つの方法があります。
TextRenderer.MeasureText
TextRenderer.DrawText
注: TextRenderer
はGDIのラッパーgraphics.DrawString
ですが、GDI+のラッパーです。
次に、既存のすべての.NETコントロールをどうするかという問題がありました。例:
彼らはそれらを使用するために切り替えたいと思っていましたTextRenderer
(すなわちGDI)が、彼らは注意しなければなりませんでした。.NET1.1のようにコントロールの描画に依存している人もいるかもしれません。そして、「互換性のあるテキストレンダリング」が生まれました。
デフォルトでは、アプリケーションのコントロールは.NET 1.1の場合と同じように動作します(「互換性があります」)。
次のコマンドを呼び出して、互換モードをオフにします。
Application.SetCompatibleTextRenderingDefault(false);
これにより、アプリケーションがより良く、より速く、より良い国際的なサポートが得られます。総括する:
SetCompatibleTextRenderingDefault(true) SetCompatibleTextRenderingDefault(false)
======================================= ========================================
default opt-in
bad good
the one we don't want to use the one we want to use
uses GDI+ for text rendering uses GDI for text rendering
graphics.MeasureString TextRenderer.MeasureText
graphics.DrawString TextRenderer.DrawText
Behaves same as 1.1 Behaves *similar* to 1.1
Looks better
Localizes better
Faster
また、GDI+とGDIフォントの描画に使用されるTextRenderingHint
対応するLOGFONT
品質との間のマッピングに注意することも役立ちます。
TextRenderingHint mapped by TextRenderer to LOGFONT quality
======================== =========================================================
ClearTypeGridFit CLEARTYPE_QUALITY (5) (Windows XP: CLEARTYPE_NATURAL (6))
AntiAliasGridFit ANTIALIASED_QUALITY (4)
AntiAlias ANTIALIASED_QUALITY (4)
SingleBitPerPixelGridFit PROOF_QUALITY (2)
SingleBitPerPixel DRAFT_QUALITY (1)
else (e.g.SystemDefault) DEFAULT_QUALITY (0)
サンプル
GDI +(graphics.DrawString)とGDI(TextRenderer.DrawText)のテキストレンダリングの比較を次に示します。
GDI +:、GDI::TextRenderingHintClearTypeGridFit
_CLEARTYPE_QUALITY

GDI +:、GDI::TextRenderingHintAntiAlias
_ANTIALIASED_QUALITY

GDI +:、GDI:サポートされていませんTextRenderingHintAntiAliasGridFit
、ANTIALIASED_QUALITYを使用します:

GDI +:、GDI::TextRenderingHintSingleBitPerPixelGridFit
_PROOF_QUALITY

GDI +:、GDI::TextRenderingHintSingleBitPerPixel
_DRAFT_QUALITY

DRAFT_QUALITY
と同じであるのは奇妙だと思います。PROOF_QUALITY
これはと同じですCLEARTYPE_QUALITY
。
も参照してください