SetCurrentConsoleFontEx () не работает с пользовательскими установленными шрифтами - PullRequest
0 голосов
/ 21 июня 2020

У меня есть собственный шрифт, установленный в моей среде (Pixel Operator Mono), и я разрабатываю консольное приложение, которому нужен этот шрифт. Это моя функция:

void set_font() {
    CONSOLE_FONT_INFOEX cfi;
    cfi.cbSize = sizeof(cfi);
    cfi.nFont = 0;
    cfi.dwFontSize.X = 0;
    cfi.dwFontSize.Y = 27;
    cfi.FontFamily = FF_DONTCARE;
    cfi.FontWeight = FW_NORMAL;
    std::wcscpy(cfi.FaceName, L"Pixel Operator Mono");
    SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
}

Использование «Consolas», «Courier New» или даже «MS Gothi c», кажется, работает нормально. Но «Pixel Operator Mono» - нет. Этот шрифт отображается в моих свойствах CMD, и я даже могу установить его по умолчанию. Но почему именно я не могу так измениться? Я уже проверил, и SetCurrentConsoleFontEx возвращает успех.

Edit 1: Я использую эту функцию для получения ошибок в виде строк. Но при отладке я вижу, что errorMessageId всегда получает 0. Я вызываю эту функцию сразу после вызова SetCurrentConsoleFontEx().

std::string GetLastErrorAsString()
{
    //Get the error message, if any.
    DWORD errorMessageID = ::GetLastError();
    if(errorMessageID == 0)
        return std::string(); //No error message has been recorded

    LPSTR messageBuffer = nullptr;
    size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                                 NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);

    std::string message(messageBuffer, size);

    //Free the buffer.
    LocalFree(messageBuffer);

    return message;
}

1 Ответ

1 голос
/ 22 июня 2020

Сначала убедитесь, что пользовательский шрифт и другие обычные шрифты находятся на одной и той же кодовой странице (обычно 437), которую можно установить с помощью SetConsoleOutputCP.

Затем для установка FontFamily, попробуйте изменить на FF_MODERN << 4 | TMPF_VECTOR | TMPF_TRUETYPE для тестирования.

Вот пример:

#include <iostream>
#include <Windows.h>
using namespace std;
void set_font() {
    CONSOLE_FONT_INFOEX cfi;
    SetConsoleOutputCP(437);
    cfi.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    cfi.nFont = 0;
    cfi.dwFontSize.X = 0;
    cfi.dwFontSize.Y = 27;
    cfi.FontFamily = FF_MODERN << 4 | TMPF_VECTOR | TMPF_TRUETYPE;
    cfi.FontWeight = FW_NORMAL;

    wcscpy(cfi.FaceName, L"Pixel Operator Mono");
    SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
    cout << "Hello" << endl;
}

int main(int argc, const char* argv[])
{
    set_font();

    return 0;
}
...