如何在 GDI 应用程序中绘制 Windows 控制台使用的光栅字体?例如,此屏幕截图中显示的 8x8 固定字体。
这些字体可以通过 CreateFont() API 使用,还是 Windows 加载这些字体的特殊方式?
控制台使用"fixed width fonts"
,例如"Courier New"
(在所有 Windows 版本中可用)或"Consolas"
(从 Vista 开始可用)。
固定宽度字体不一定是光栅。要使用光栅字体,请枚举字体以查找光栅字体,例如"Terminal"
或"Fixedsys"
。您必须使用正确的大小(例如,"Terminal"
字体为 18),否则 Windows 可能会替换为不同的字体并调整大小。DPI设置也有问题。如果程序不支持 DPI,则如果工作站具有高 DPI 设置,则会发生放大。
case WM_PAINT:
{
PAINTSTRUCT ps;
auto hdc = BeginPaint(hwnd, &ps);
auto hfont = CreateFont(-18, 0, 0, 0, 0, 0, 0, 0,
ANSI_CHARSET,
OUT_DEVICE_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH,
L"Terminal");
auto oldfont = SelectObject(hdc, hfont);
RECT rc = { 0,0,100,300 };
DrawText(hdc, L"Test 123", -1, &rc, DT_LEFT | DT_TOP);
SelectObject(hdc, oldfont);
DeleteObject(hfont);
EndPaint(hwnd, &ps);
return 0;
}
答案类似于 Barmak 的答案,不同之处在于指定了宽度和高度,因此要为 8x8 光栅字体创建字体,我使用以下代码:
hfont = CreateFont(-8, -8, 0, 0, 0, 0, 0, 0, OEM_CHARSET, OUT_DEVICE_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, _T("Terminal"));
具体来说,必须指定高度和宽度,并且必须指定 OEM_CHARSET 字符集,才能选择其中一种光栅字体。
我的意图是渲染到 DirectDraw 表面 ( IDirectDrawSurface7::GetDC()
),然后随后将该表面绘制到主表面,如下所示:
通过涉及多次传递的一些技巧,我向文本添加了一些阴影效果,但这超出了范围我原来的问题。