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 コントロール等に描画した場合も、現象が発生します。 Windows 7 では、以下のとおりです。 Windows 8 では、以下のとおりです。  …


フォントファミリーとタイプフェースの指定

こんにちは、Visual Studio サポート チームです。 今回はフォントについてのお話です。 期待したデザインで文字をレンダリング (表示や印刷) するためには、適切なフォントファミリーとタイプフェース(書体)を指定することが重要です。 以下では、フォントファミリーとタイプフェースの指定で押さえておきたいポイントについて紹介したいと思います。   フォントファミリーとタイプフェースについて 多くのフォントファミリーでは、標準・ボールド・イタリック・ボールドイタリックの 4 種類のタイプフェースが組み込まれています。 しかし、タイプフェースの種類は、必ずしも、この 4 種類だけとは限らず、その他の種類が含まれる場合があり、Windows のフォントでもタイプフェースは多様化しています。 WPFなどのアプリケーション開発では、このような多様化したタイプフェースに対しては、FamilyTypeface クラスで適切な値を指定する必要があります。タイプフェースの種類が多い Arial で具体例を説明します。   Arialの例 まず、エクスプローラーでフォントフォルダー (%WINDIR%\Fonts) をオープンし、 “Arial” をダブルクリックして見ていただくと以下のタイプフェースが列挙されます。      Arial のタイプフェース やや狭い やや狭い斜体 やや狭い太字 やや狭い太字 太字 極太 斜体 太字 太字 太字 標準 標準的なタイプフェースの4 種類のみで考えてしまうと “やや狭い” を “Arial Narrow” というフォント ファミリーで指定したり、”極太” を “Arial Black” というフォントファミリーで指定しがちですが、実際には…


アプリケーションで、文字化けを回避するためのアプローチ

こんにちは、Visual Studio サポートチームです。 今回は、ミッシング グリフについてご案内いたします。 文字を表示したり、印刷する際に時折、文字化けに悩まされることがあります。 では、どうして文字化けが発生するのでしょうか? その要因の一つとして、このミッシング グリフが挙げられます。 グリフとは 文字コードに対応する文字の形状であり、フォント ファイルに含まれるデータとなります。 アプリケーションで、文字を表示する際には、フォントと文字コードを指定すると、Win32 API や .NET Framework の内部処理では、フォントファイルを参照し、文字コードに対応するグリフを検索をします。 この検索で、グリフが見つからない場合、文字化けが発生します。 つまり、アプリケーションが指定したフォントと文字コードのミスマッチが、文字化けの原因となります。 この状態をミッシング グリフと称します。 ミッシング グリフが発生した場合には、フォント ファイルのグリフの 0 番目に代替用のグリフを用意していますが、このグリフは、”□” であったり “・” であったり、どのようなグリフが用意されているかは決まっていません。 また、Win32 API や .NET Framework の内部処理では、ミッシング グリフが発生した場合、別のフォントを代用して、ターゲットの文字コードに対するグリフの検索を行っています。 この代用処理は、代表的なフォントに対してのみ検索しており、インストールされている全てのフォントは検索していないため、残念ながらこの代用処理でもミッシンググリフを確実に回避することはできません。 また、複数のフォントを検索するため、フォント ファイルが用意している代替用のグリフを利用せず、Win32 API や .NET Framework の Runtime が個別に用意している代替用のグリフが利用されます。 これらの代替用のグリフは Win32 API や .NET Framework ごとに共通ではなく、各関数やメソッドごとに異なるグリフが利用されます。 このため、アプリケーションがフォントと文字コードのミスマッチを起こすような処理を行うと、以下の何れかの現象が発生します。…