Как нарисовать растровые консольные шрифты в GDI? - PullRequest
0 голосов
/ 30 сентября 2018

Как нарисовать растровые шрифты, используемые консолью Windows, в приложении GDI?Например, фиксированный шрифт 8x8, как показано на этом снимке экрана. Command Prompt Properties - raster fonts

Можно ли использовать эти шрифты через API CreateFont (), или есть какой-то особый способ загрузки этих Windows?шрифты

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Ответ был аналогичен ответу Бармака, с той разницей, что указаны ширина и высота, поэтому для создания шрифта для растрового шрифта 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
С небольшим количеством хитрости, включающей несколько проходов, я добавил немного эффекта тени к тексту, однако это выходит за рамкимоего оригинального вопроса.

0 голосов
/ 30 сентября 2018

Консоль использует "fixed width fonts", например "Courier New" (доступно во всех версиях Windows) или "Consolas" (доступно с Vista).

Шрифты фиксированной ширины не обязательно являются растровыми.Чтобы использовать растровые шрифты, перечислите шрифты, чтобы найти растровый шрифт, например "Terminal" или "Fixedsys".Вы должны использовать правильный размер (например, 18 для шрифта "Terminal"), иначе 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;
}
...