Graphics.DrawString メソッドで游ゴシック・游明朝の文字を縦書きした際の描画位置が OS によって異なる
こんにちは、Visual Studio サポート チームです。
.NET Framework アプリケーション上で文字列を描画する場合、最も利用されているメソッドは、Graphics.DrawString メソッドではないでしょうか。Graphics.DrawString メソッドでは、描画位置、フォント、色、書式の属性等を指定することができ、印刷にも対応しています。
今回は、Graphics.DrawString メソッドを利用して、游ゴシックまたは游明朝の文字を縦書きした場合に、Windows 7 と Windows 8 以降の OS で、文字の描画位置が異なる現象についてお知らせします。
現象
Graphics.DrawString メソッドでは、引数の Font クラスと StringFormat クラスで指定したフォントと書式属性を用いて文字列を描画することができます。
ここで「游ゴシック」または「游明朝」フォントを指定し、書式属性で縦書き (StringFormatFlags.DirectionVertical) を指定した場合、文字によっては Windows 7 と Windows 8 以降の OS で、描画される位置が異なる場合があります。
たとえば、鉤括弧 "「" を描画した場合、Windows 8 以降では Windows 7 よりも出力される位置が上寄りになります。本現象は、描画対象のコントロールには依存せず、PictureBox コントロールや PrintPreviewControl コントロール等に描画した場合も、現象が発生します。
原因
本現象は、Graphics.DrawString メソッドが内部で利用している GDI+ モジュールの内部実装と「游ゴシック」、および「游明朝」の組み合わせで発生する不具合に起因して発生しています。その他のフォントでは発生しません。
また、.NET Framework のバージョンとの関連性はないため、.NET Framework のバージョンに関係なく発生します。
発生条件は以下の 3 点です。
- Graphics.DrawString を利用していること
- 縦書きであること
- フォントの種類が「游ゴシック」もしくは「游明朝」であること
回避方法
回避方法はありません。
マイクロソフトではこの問題を製品の不具合と認識しておりますが、現状では、修正プログラムは提供されておりません。
弊社製品の不具合によりお客様にご迷惑をおかけしておりますこと、深くお詫び申し上げます。
参考
Graphics.DrawString メソッドのほかに、System.Windows.Forms 名前空間にある、TextRenderer.DrawText メソッドでも文字列を描画することができます。Graphics.DrawString メソッドとの違いは、Graphics.DrawString メソッドが GDI+ を使ってテキスト描画しているのに対して、TextRenderer.DrawText メソッドは GDI を使用している点です。
この違いから、本件のように、GDI+ にて発生する不具合の場合は、TextRenderer.DrawText メソッドでは発生しません。表示形式を指定できないため、本現象の代替方法としては利用できませんが、通常の Graphics.DrowString メソッドの呼び出しであれば、TextRenderer.DrawText メソッドを代わりにご利用いただくことが可能です。ただ、TextRenderer.DrawText メソッドは、印刷に使用することはできませんのでご注意ください。
※2015/08/25 追記
なお、類似の現象を Graphics.DrawString メソッドで文字が斜体にならないことがある にて報告しています。