改行文字の幅

.NET の描画コアである System.Drawing namespace は Windows の GDI+ の機能を .NET から扱うためのインターフェスでしかない。
つまり、.NET の問題ではなく GDI+ の問題にも目をむけなければならない。
文字を描画する MeasureString や DrawString には、UTF-16 形式の文字列を LF で改行した文字列を渡す必要があるのだが、日本語ロケールの前述の2つの関数は LF 文字の幅を半角空白として計算する。
つまり "hoge\nhoge" という文字列を右詰で描画すると

hoge
 hoge

と描画される、という問題があることに注意しなければならない。
当然、"hoge\nhoge\n" とすれば文字の位置は揃うが、MeasureString した範囲に描画したりすると右側に余白ができてしまうことになる。