GDIのDrawText()をGDI+のDrawString()に置き換えたい – プログラミング – Home

通知
すべてクリア

GDIのDrawText()をGDI+のDrawString()に置き換えたい


亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

現在、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+にあるのでしょうか。
よろしくお願いいたします。


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

あまり詳しくありません。
 1.アンチエイリアスをかけない場合はどうでしょう。
 2.SaveDC()、RestoreDC()を削除してみたらどうでしょう。
すでに検証済みだったならすみません。


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

ご意見ありがとうございます。

> 1.アンチエイリアスをかけない場合はどうでしょう。

TextRenderingHintAntiAliasのオンオフで、描画位置が微妙に異なるようです。
ただし、上のGDIに近づくほどの差はなく、左端の開始位置も変わりませんでした。

> 2.SaveDC()、RestoreDC()を削除してみたらどうでしょう。

こちらは違いはありませんでした。

TextRenderingHintAntiAliasのオンオフだけで微妙に位置が変わるということは、
今までDrawText()で描いていたものを置き換えるという目的は難しいのでしょうか。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

全てのフォントサイズにおいて、完全に同じ幅にするのは不可能かもしれません。
以下のページにその理由が記されています。

https://support.microsoft.com/en-us/kb/307208


返信引用
亀山
 亀山
(@亀山)
ゲスト
結合: 18年前
投稿: 133
Topic starter  

情報ありがとうございます。
GDIのテキストと同じものをGDI+で描画するということは不可能なのですかね。

ちなみに、ネット上でいろいろ探してみたところ、

GDIのBeginPath()/EndPath()/GetPath()を使って、TextOut()やDrawText()のパスを作成

そのパスの座標配列やバイト配列を、自前でGDI+のGraphicsPathに変換

そのGraphicsPathを、SmoothingModeAntiAliasなどのモードで描画する

という手法がありました。

「自前でGDI+のGraphicsPathに変換」の部分がかなり力業ですが、
確かにこの方法だと、GDIのテキストの形状のまま、
GDI+でいろいろこだわった描画を行えるのでないかと思います。

ただこのやり方だと、テキストが多いと処理が遅くなりそうな気はしますし、
印刷処理でPDF化したときには、文字情報が失われてしまいますね。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

MFCでフォントの設定で「FIXED_PITCH」を指定しないとだめだと思いますね。
MS ゴシックを使うと合わせやすいです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました