【发布时间】:2018-09-30 02:01:42
【问题描述】:
如何在 GDI 应用程序中绘制 Windows 控制台使用的光栅字体?例如,截图中显示的 8x8 固定字体。
这些字体是否可以通过 CreateFont() API 使用,或者 Windows 是否有一些特殊的方式加载这些字体?
【问题讨论】:
标签: winapi gdi bitmap-fonts
如何在 GDI 应用程序中绘制 Windows 控制台使用的光栅字体?例如,截图中显示的 8x8 固定字体。
这些字体是否可以通过 CreateFont() API 使用,或者 Windows 是否有一些特殊的方式加载这些字体?
【问题讨论】:
标签: winapi gdi bitmap-fonts
控制台使用"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;
}
【讨论】:
-8,-8,我必须对该示例进行的另一个更改是将ANSI_CHARSET 替换为iCharSet 参数的OEM_CHARSET。
答案与 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()),然后将该表面绘制到主表面,如下所示:
通过涉及多次传递的一些技巧,我在文本中添加了一些阴影效果,但这超出了我最初问题的范围。
【讨论】: