【问题标题】:SetCurrentConsoleFontEx() doesn't work with custom installed fontsSetCurrentConsoleFontEx() 不适用于自定义安装的字体
【发布时间】:2020-06-21 12:59:06
【问题描述】:

我在我的环境中安装了自定义字体(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”似乎都可以正常工作。但是“Pixel Operator Mono”没有。该字体显示在我的 CMD 属性中,我什至可以将其设置为默认字体。但是为什么我不能改变这种方式呢?我已经检查过了,SetCurrentConsoleFontEx 正在返回成功。

编辑 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;
}

【问题讨论】:

标签: c++ c++11 winapi visual-c++


【解决方案1】:

首先要确保自定义字体和其他普通字体在同一个代码页(一般是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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多