現在、MFCを使用するプロジェクトで、GDIのDrawText()で描画していたものを、
GDI+のDrawString()に置き換えられるか調べています。
試しにダイアログベースのテストアプリに以下のような描画ルーチンを入れてみました。
ダイアログ自体のサイズはプロジェクトを作成したときのままで、
GDI+の初期化などはアプリケーションクラスの中で行っています。
void CTestDlg::OnPaint()
{
CPaintDC dc(this);
CFont font;
font.CreatePointFont(240, _T(MS Pゴシック), &dc);
// GDI
dc.SaveDC();
dc.SelectObject(&font);
dc.SetTextColor(RGB(0, 0, 0));
dc.SetBkMode(TRANSPARENT);
dc.DrawText(_T(あいうえおアイウエオ1234567890ABCDEFG), CRect(0, 0, 1000,
1000), DT_LEFT | DT_TOP);
dc.RestoreDC(-1);
// GDI+
Graphics graphics(dc.m_hDC);
graphics.SetPageUnit(UnitPixel);
graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
graphics.DrawString(_T(あいうえおアイウエオ1234567890ABCDEFG), -1,
&Font(dc.m_hDC, (HFONT)font),
RectF(0, 40, 1000, 1000),
&StringFormat(),
&SolidBrush(Color(0, 0, 0)));
}
描画自体は行えているのですが、
開始位置や文字間隔などが微妙に異なるようで、同じように描画されません。
左端の座標がまず異なり、DrawText()は「F」、DrawString()は「E」まで表示されます。
これらを可能な限り近づけられるようなパラメータは、GDI+にあるのでしょうか。
よろしくお願いいたします。
あまり詳しくありません。
1.アンチエイリアスをかけない場合はどうでしょう。
2.SaveDC()、RestoreDC()を削除してみたらどうでしょう。
すでに検証済みだったならすみません。
ご意見ありがとうございます。
> 1.アンチエイリアスをかけない場合はどうでしょう。
TextRenderingHintAntiAliasのオンオフで、描画位置が微妙に異なるようです。
ただし、上のGDIに近づくほどの差はなく、左端の開始位置も変わりませんでした。
> 2.SaveDC()、RestoreDC()を削除してみたらどうでしょう。
こちらは違いはありませんでした。
TextRenderingHintAntiAliasのオンオフだけで微妙に位置が変わるということは、
今までDrawText()で描いていたものを置き換えるという目的は難しいのでしょうか。
全てのフォントサイズにおいて、完全に同じ幅にするのは不可能かもしれません。
以下のページにその理由が記されています。
https://support.microsoft.com/en-us/kb/307208
情報ありがとうございます。
GDIのテキストと同じものをGDI+で描画するということは不可能なのですかね。
ちなみに、ネット上でいろいろ探してみたところ、
GDIのBeginPath()/EndPath()/GetPath()を使って、TextOut()やDrawText()のパスを作成
↓
そのパスの座標配列やバイト配列を、自前でGDI+のGraphicsPathに変換
↓
そのGraphicsPathを、SmoothingModeAntiAliasなどのモードで描画する
という手法がありました。
「自前でGDI+のGraphicsPathに変換」の部分がかなり力業ですが、
確かにこの方法だと、GDIのテキストの形状のまま、
GDI+でいろいろこだわった描画を行えるのでないかと思います。
ただこのやり方だと、テキストが多いと処理が遅くなりそうな気はしますし、
印刷処理でPDF化したときには、文字情報が失われてしまいますね。
MFCでフォントの設定で「FIXED_PITCH」を指定しないとだめだと思いますね。
MS ゴシックを使うと合わせやすいです。