如何用GDI +修复字体渲染?

时间:2013-10-03 19:07:03

标签: c++ gdi+ gdi

使用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

以下是使用这两种方法拍摄的屏幕截图

Using GDI

Using GDI+

屏幕截图并没有很好地显示清晰度的差异,但是当它发送到打印机时,差异非常直言不讳。用GDI +打印的文字甚至不是真正的黑色,而是更像灰色。

我尝试过Graphics :: SetTextRenderingHint,SetCompositingMode,SetCompositingQuality和SetInterpolationMode方法,但它似乎没有任何区别。

我还尝试将GDI和GDI +结合起来,即使用CreateFont创建字体,然后实例化Gdiplus :: Font(HDC,HFONT),但是我无法正确调整大小。

有没有办法让GDI +字体像GDI一样呈现?

0 个答案:

没有答案