掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ズーム時のフォントが正確に描画されません (ID:72837)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 最後の「0」の文字と他のオブジェクトの位置の比率が倍率によって変わるのです。 TextOut(x, y, "1234567890", ...); のように”文字列”で描画していると倍率によっては誤差が生じる。 例えば、1.0倍時に↓サイズで(等倍フォントで)描画されていた文字列があるとする。 ・文字幅16pixel x 10文字 = 160pixel それを仮に2.4倍率で描画するとした場合↓(机上の計算)となる。 ・int(文字幅16pixel * 2.4 + 0.5) x 10文字 = 380pixel だが、正確には↓なので、小数点以下の値により誤差が生じてしまう。 ・(1.0倍時の文字列幅)160pixel x 2.4倍 = 384pixel > その比率を統一する方法が知りたいです。 案1:スマートじゃないが、1文字づつ位置を計算して1文字づつ文字描画 void textout(CDC &dc, int fontsize, POINT p, LPCWSTR string, double viewratio) { CFont zoomed, base; zoomed.CreateFont(fontsize * viewratio, ...); base.CreateFont(fontsize, ...); CDC attr; // 等倍表示(==1.0倍)時の位置計算用 attr.CreateCompatibleDC(&dc); CFont *prevfont1 = dc.SelectObject(&zoomed); CFont *prevfont2 = attr.SelectObject(&base); double x = p.x; for (int i=0; string[i] != L'\0'; ++i) { ::TextOutW(dc, int(x + 0.5), p.y, &string[i], 1); SIZE size; ::GetTextExtentPoint32W(attr, &string[i], 1, &size); x += size.cx * viewratio; } } 案2:GDI+(案1と比較すると少しズレるケースもあるがGDIよりは遥かにマシ) void textout(CDC &dc, int fontsize, POINT p, LPCWSTR string, double viewratio) { Gdiplus::Graphics graphics(dc); graphics.DrawString( string, -1, &Gdiplus::Font(L"フォント名", fontsize * viewratio, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel), Gdiplus::PointF(p.x, p.y), Gdiplus::StringFormat::GenericTypographic(), &Gdiplus::SolidBrush(Gdiplus::Color(赤, 緑, 青)) ); }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.