C++ SetCurrentConsoleFontEx()不适用于自定义安装的字体

C++ SetCurrentConsoleFontEx()不适用于自定义安装的字体,c++,c++11,winapi,visual-c++,C++,C++11,Winapi,Visual C++,我在我的环境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;

我在我的环境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 Gothic似乎可以很好地工作。但像素运营商Mono没有。该字体显示在我的CMD属性上,我甚至可以设置为默认字体。但为什么我不能这样改变呢?我已经检查过了,SetCurrentConsoleFontEx正在返回成功

编辑1: 我使用这个函数来获取字符串形式的错误。但我可以看到errorMessageId总是为0。我在SetCurrentConsoleFontEx调用之后立即调用此函数


首先确保自定义字体和其他普通字体位于同一代码页(通常为437)中,可以通过设置


接下来,对于的设置,尝试修改为FF_MODERN,函数返回1,GetLastError返回0。这应该意味着没有错误。正如我们愿意相信你的话,10个开发人员中有9个错误报告。显示错误处理代码。编辑帖子以添加错误处理代码。错误处理代码仍然丢失。
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;
}
#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;
}