【问题标题】:How to draw raster console fonts in GDI?如何在 GDI 中绘制光栅控制台字体?
【发布时间】:2018-09-30 02:01:42
【问题描述】:

如何在 GDI 应用程序中绘制 Windows 控制台使用的光栅字体?例如,截图中显示的 8x8 固定字体。

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

【问题讨论】:

    标签: winapi gdi bitmap-fonts


    【解决方案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;
    }
    

    【讨论】:

    • 关于 DPI 设置,我计划绘制到屏幕外位图(使用内存 HDC 而不是 BeginPaint/EndPaint)。无论显示器 DPI 设置如何,如何选择特定的位图字体?
    • 所以在我的测试中,无论 DPI 如何,我都能可靠地选择一个尺寸,但是我必须进行以下更改: 必须指定 cWidth,因此要选择 8x8 字体,我必须具有前两个参数是-8,-8,我必须对该示例进行的另一个更改是将ANSI_CHARSET 替换为iCharSet 参数的OEM_CHARSET
    • 请编辑问题以显示您在做什么、输出的外观以及您期望的输出应该是什么样的。
    【解决方案2】:

    答案与 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-06-12
      • 2016-03-02
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多