如何在GDI中绘制栅格控制台字体?

时间:2018-09-30 02:01:43

标签: winapi gdi bitmap-fonts

如何在GDI应用程序中绘制Windows控制台使用的光栅字体?例如,如屏幕截图所示,为8x8固定字体。Command Prompt Properties - raster fonts

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

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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()),然后将该表面绘制到主要表面,如下所示:
enter image description here
通过涉及多次通过的一些技巧,我为文本添加了一些阴影效果,但这超出了我最初提出的问题的范围。