1

GDI+ を使用してテキストを描画すると、フォントが必要な方法でレンダリングされません。GDI を使用する場合と比較して、文字の「太字」が少なくなり、エッジがぼやけます。以下のコード サンプルは、私がテストした 2 つの実装を示しています。

static const std::wstring fontFamily(L"Arial Narrow");
static const int pointSize = 36;

#if 1 // Using GDI+
static const std::wstring text(L"Using GDI+");
VOID OnPaint(HDC hdc)
{
    Graphics graphics(hdc);

    Font font(fontFamily.c_str(), pointSize, FontStyle::FontStyleBold, UnitPoint);
    SolidBrush brush(Color(255, 0, 0, 0));

    graphics.DrawString(
      text.c_str()
    , text.length()
    , &font
    , PointF(10, 10)
    , &brush
    );
}

#else // Using GDI

static const std::wstring text(L"Using GDI");
VOID OnPaint(HDC hdc)
{
    int nHeight = -::MulDiv(pointSize, ::GetDeviceCaps(hdc, LOGPIXELSY), 72);
    HFONT hf = ::CreateFont(
      nHeight
    , 0
    , 0
    , 0
    , FW_BOLD
    , 0
    , 0
    , 0
    , DEFAULT_CHARSET
    , OUT_DEFAULT_PRECIS
    , CLIP_DEFAULT_PRECIS
    , DEFAULT_QUALITY
    , DEFAULT_PITCH
    , fontFamily.c_str()
    );

    ::SelectObject(hdc, hf);

    RECT bounds;
    SetRect(&bounds, 10, 10, 300, 300);

    ::DrawText(hdc, text.c_str(), text.length(), &bounds, 0);

    ::DeleteObject(hf);
}
#endif

両方の方法で撮影したスクリーンショットを次に示します

GDI の使用

GDI+ の使用

スクリーンショットではシャープネスの違いがよくわかりませんが、プリンターに送ると違いがはっきりとわかります。GDI+ で印刷されたテキストは、実際には黒ではなく、グレーに近くなっています。

Graphics::SetTextRenderingHint、SetCompositingMode、SetCompositingQuality、および SetInterpolationMode のメソッドを試しましたが、違いはないようです。

また、GDI と GDI+ を組み合わせようとしました。つまり、CreateFont を使用してフォントを作成し、Gdiplus::Font(HDC, HFONT) をインスタンス化しましたが、正しいサイズを取得できません。

GDI+ フォントを GDI とまったく同じようにレンダリングする方法はありますか?

4

0 に答える 0