PR

Graphics::DrawStringの余白について

C#
記事内に広告が含まれています。

とあるツールを作っている際にGraphics::DrawString関数で描画した際に意図しない余白が入ることに気がついたのでそのお話です。必要があって、P/Invoke(プラットフォーム呼びだし)を使ってます。

Win32APIのGetCharABCWidthsで取得出るABCの値について

画像のように

  • A : レフトサイドベアリグン (余白)
  • B : 文字(glyph)自体の幅
  • C : ライトサイドベアリング (余白)

の値が求まります。

画像はMS Pゴシックの”a”の文字。

Win32APIのGetCharABCWidthsすると下記のような情報を取得できます。

  • a : A幅 18 / B幅 208 / C幅 18
  • b : A幅 26 / B幅 202 / C幅 26
  • c : A幅 24 / B幅 210 / C幅 22
単純にGraphics::DrawStringで描画した場合と指定しない場合

Graphics::DrawStringに”StringFormat.GenericTypographic”を引数で渡した場合の違いの画像を下に置きます。

描画して画像で色分けしてみると一目瞭然なのですが、StringFormat.GenericTypographicを指定しないで描画した場合は勝手に空白が入ってしまいます。

AIに聞いてみると

StringFormat.GenericDefault は、Windowsの従来のGDI描画互換性を優先するため、フォント設計値に忠実ではありません。

この設定では、文字幅の計算にGDIメトリクスが使用され、テキストの始点と終点に余分なパディング(Leading/Trailing Whitespace)が自動的に追加されます。また、ベースラインや描画オフセットは、フォント設計上の値よりもGDI環境設定に依存して補正されます。

ということだそうです。なのでフォントに忠実に描画したければ、StringFormat.GenericTypographicを指定しないとダメという事でした。

コメント

タイトルとURLをコピーしました