日記移転先(゜▽゜)

という名前の適当な日記ブログ


| Home | Index | Links | About |

Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C#のDrawStringの描画位置

気分はForm!:実はWPFってしっくりこないんです(゜д゜;
て事もないがDrawString()の高さ絡みのメモ。

まずフォントの高さ辺りで調べると
方法 : フォント メトリックを取得する
http://msdn.microsoft.com/ja-jp/library/xwf9s90b(v=vs.80).aspx
Visual Basic .NET によるプログラミング Windows - 第 17 章 テキストとフォント
http://msdn.microsoft.com/ja-jp/library/dd297679.aspx#_17_11
 
↑下はVBの本だが17.11辺りにこんな図と共に。
ここから書体の用語を漁るのでなくTrueTypeの中身を調べる方向へ行くのが正解と思~。
Microsoft Typography - Features of TrueType and OpenType
http://www.microsoft.com/typography/SpecificationsOverview.mspx

上図メソッドTrueTypeのヘッダ
-GetEmHeight(FontStyle)head unitsPerEm
アセントGetCellAscent(FontStyle)hhea Ascender
ディセントGetCellDescent(FontStyle)hhea Descender(-)
行間GetLineSpacing(FontStyle)-
スペース-hhea LineGap

DrawString()のy座標との関係。(※1行のみの表示の場合)

StringFormatのLineAlignmentの指定なしやNearで上に合わせる場合、
 指定したy座標にアセントを加えた高さをベースラインとして描かれる。
多くの和文フォントは仮想ボディ上端=yになる。


LineAlignmentがCenterの場合。和文仮想ボディの中心は期待できない。行間の真ん中でもない。
MSゴシック等の「アセント+ディセント=Em=行間」になってるフォントに対してもEm/16分程
上にずれたように表示される。MeiryoUIだけこれで中心が合う。
…とy座標の位置は色々なフォントで試す程混乱したが
 指定したy座標+アセント-行間÷2-Em÷16の位置をベースラインとして描画
だった…(数日悩んだわ(゜д゜))


フォントごとの数値でずれ検証。先に挙げた4種の値で分類。
LG=0LG≠0
MSゴシック/明朝
HGフォント系
DFフォント系
IPAモナー
nukamiso
花園明朝A(2012.4) Ascent+Descent≦Em
IPAフォント
MeiryoKe
Arial
花園明朝A(2013.2)
Ascet+Descent>Em
メイリオ
Meiryo UI
LucidaSansUnicode
M+フォント
Ascent>Em
ベースライン-アセントの高さが和文仮想ボディ上端とずれるのは最下段だけ全部。
仮想ボディ中心or上端取得が無理っぽいものはベースラインの高さで合わす。

大雑把にやるなら表の最下段のフォントだけベースラインの高さをアセントでなくEmから計算した値を使う。
値は固定なら上:下=7:1でよさそう。メイリオ、MeiryoUIは丁度その高さで合わせてある。

個別に調整できるようにしてもフォント自体が収録文字の高さを合わせてないと(ry

上の表では最下段じゃないがMeiryoKeはずれる。
M+フォントは和文文字の仮想ボディの高さをフォント内で一致させてないっぽい。
花園明朝が古かったので2013.2版にしたらA+D>Emのずれるタイプになった('A`)



新規
←管理者にだけ表示する場合チェック



トラックバック用URL:
http://r2089.blog36.fc2.com/tb.php/160-e9e016eb

Appendix

profile

那駕〇

Author:那駕〇

recent entries

アクセスの多い記事

過去の記事


義援金募集

FC2「東北地方太平洋沖地震」義援金募集につきまして

ブロとも申請フォーム

この人とブロともになる

カウンタ

※ここより下の部分に掲示板とかまとめとかいうリンクがあってもそれはfc2blogの広告なので当blog内コンテンツではないです(゜д゜)
まとめ
....
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。