You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows系统下如何修改控制台字体大小及其他属性,并实现多行不同字号显示?

Windows系统下如何修改控制台字体大小及其他属性,并实现多行不同字号显示?

嗨,我来帮你搞定这个问题!你想要调整Windows控制台的字体大小,还希望能同时显示不同字号的内容,对吧?先说说你贴的那段代码为啥没生效,再给你靠谱的解决方案。

先分析你之前代码失效的可能原因

你从StackOverflow拿的那段代码没起作用,大概率是这几个细节没做好:

  • 缺少必要头文件:没包含<windows.h>的话,CONSOLE_FONT_INFOEX结构体、SetCurrentConsoleFontEx这些API根本找不到,编译都通不过更别说运行了
  • 字符集设置不对:如果你的项目用的是多字节字符集,代码里的L"Consolas"这种宽字符字符串会出问题,导致字体名称拷贝失败
  • 没做错误检查:你没判断GetStdHandleSetCurrentConsoleFontEx这些函数的返回值,就算调用失败也不知道问题出在哪
  • 控制台兼容性问题:旧版CMD对部分字体/字号支持有限,换成Windows Terminal试试兼容性会好很多

基础字体修改的正确实现

先给你能正常生效的基础版代码,包含必要的错误检查和头文件:

#include <windows.h>
#include <iostream>
#include <cstring>

int main() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        std::cerr << "获取控制台句柄失败!错误码:" << GetLastError() << std::endl;
        return 1;
    }

    CONSOLE_FONT_INFOEX cfi;
    cfi.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    // 先获取当前字体信息,避免覆盖其他属性
    if (!GetCurrentConsoleFontEx(hConsole, FALSE, &cfi)) {
        std::cerr << "获取当前字体信息失败!错误码:" << GetLastError() << std::endl;
        return 1;
    }

    cfi.dwFontSize.X = 0; // 让系统自动匹配字体宽度
    cfi.dwFontSize.Y = 24; // 设置字体高度(字号)
    cfi.FontFamily = FF_DONTCARE;
    cfi.FontWeight = FW_NORMAL;
    std::wcscpy(cfi.FaceName, L"Consolas"); // 指定字体

    if (!SetCurrentConsoleFontEx(hConsole, FALSE, &cfi)) {
        std::cerr << "设置字体失败!错误码:" << GetLastError() << std::endl;
        return 1;
    }

    std::wcout << L"Font: Consolas, Size: 24\n";
    return 0;
}

注意:如果用VS编译,记得把项目的字符集改成Unicode字符集(项目属性 -> 常规 -> 字符集),不然宽字符会出乱码。

实现多行不同字号的显示

要在同一控制台里显示不同字号的内容,思路很简单:每次输出前切换对应的字体设置。我给你封装一个便捷的函数,这样调用起来更省心:

#include <windows.h>
#include <iostream>
#include <cstring>

// 封装字体设置函数:参数是字号和字体名称(默认Consolas)
bool SetConsoleFont(int fontSize, const wchar_t* fontName = L"Consolas") {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        std::cerr << "获取控制台句柄失败!错误码:" << GetLastError() << std::endl;
        return false;
    }

    CONSOLE_FONT_INFOEX cfi;
    cfi.cbSize = sizeof(CONSOLE_FONT_INFOEX);
    if (!GetCurrentConsoleFontEx(hConsole, FALSE, &cfi)) {
        std::cerr << "获取当前字体信息失败!错误码:" << GetLastError() << std::endl;
        return false;
    }

    cfi.dwFontSize.Y = fontSize;
    cfi.dwFontSize.X = 0; // 自动匹配宽度
    std::wcscpy(cfi.FaceName, fontName);

    if (!SetCurrentConsoleFontEx(hConsole, FALSE, &cfi)) {
        std::cerr << "设置字体失败!错误码:" << GetLastError() << std::endl;
        return false;
    }
    return true;
}

int main() {
    // 设置字号24,输出第一行
    if (SetConsoleFont(24)) {
        std::wcout << L"👉 这是字号24的Consolas字体内容\n";
    }

    // 设置字号16,输出第二行
    if (SetConsoleFont(16)) {
        std::wcout << L"👉 这是字号16的Consolas字体内容\n";
    }

    // 设置字号32,换成微软雅黑字体
    if (SetConsoleFont(32, L"微软雅黑")) {
        std::wcout << L"👉 这是字号32的微软雅黑字体内容\n";
    }

    return 0;
}

额外注意事项

  • 不是所有字体都能在控制台使用,只有系统注册的控制台兼容字体才行,比如Consolas、微软雅黑、宋体等
  • 如果需要输出中文,一定要用std::wcout配合Unicode字符集,避免乱码
  • 切换字体后,控制台的光标位置可能会微调,但不会影响内容显示
  • 如果你用的是Windows Terminal,效果会比旧版CMD好很多,支持更多字体和字号

备注:内容来源于stack exchange,提问作者Flowlessrusher

火山引擎 最新活动