使用 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+ 打印的文本甚至不是真正的黑色,而是更接近灰色。
我尝试过Graphics::SetTextRenderingHint、SetCompositingMode、SetCompositingQuality 和SetInterpolationMode 方法,但似乎没有任何区别。
我还尝试将 GDI 和 GDI+ 结合起来,即使用 CreateFont 创建字体,然后实例化 Gdiplus::Font(HDC, HFONT),但是我无法获得正确的大小。
有没有办法让 GDI+ 字体像 GDI 一样呈现?