0

如何在 GDI 应用程序中绘制 Windows 控制台使用的光栅字体?例如,此屏幕截图中显示的 8x8 固定字体。命令提示符属性 - 光栅字体

这些字体可以通过 CreateFont() API 使用,还是 Windows 加载这些字体的特殊方式?

4

2 回答 2

1

控制台使用"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;
}
于 2018-09-30T19:25:46.097 回答
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()),然后随后将该表面绘制到主表面,如下所示: 通过涉及多次传递的一些技巧,我向文本添加了一些阴影效果,但这超出了范围我原来的问题。
在此处输入图像描述

于 2018-10-06T20:00:46.090 回答