You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ ASCII游戏开发中如何单独调整控制台文本的X/Y轴拉伸缩放比例

你遇到的Y轴拉伸效果参考如下:
示例图片

问题原因

你遇到的同步缩放问题本质是系统控制台默认使用的TrueType字体(比如Consolas、微软雅黑等)都自带固定宽高比约束,当你单独修改dwFontSize.X或dwFontSize.Y时,系统会自动调整另一个值匹配字体原生比例,因此无法实现非等比拉伸。你之前提到的SetConsoleTextAttribute是控制台文本颜色属性设置接口,和字体尺寸调整无关,实际生效的是你代码中用到的SetCurrentConsoleFontEx。

小提示:你当前代码中new的CONSOLE_FONT_INFOEX对象没有调用delete释放,会产生内存泄漏,建议改为栈上分配即可,无需动态申请内存。

可行解决方法

方案1:使用系统内置点阵字体实现非等比缩放

Windows控制台内置的Terminal点阵字体提供了多种非等比例的预设尺寸,支持单独调整宽高比:

  • 先调用EnumConsoleFontsEx枚举当前控制台可用的所有字体尺寸,筛选符合你需要的X/Y比例的配置
  • 直接设置对应尺寸即可,无需手动修改X/Y值触发系统自动校正

示例代码片段:

// 枚举可用字体尺寸的回调逻辑
int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD FontType, LPARAM lParam)
{
    std::vector<COORD>* sizeList = reinterpret_cast<std::vector<COORD>*>(lParam);
    COORD fontSize = {lpelfe->elfLogFont.lfWidth, abs(lpelfe->elfLogFont.lfHeight)};
    sizeList->push_back(fontSize);
    return 1;
}

// 调用枚举获取Terminal字体的所有可用尺寸
std::vector<COORD> availableSizes;
HDC hdc = GetDC(GetConsoleWindow());
LOGFONT lf = {0};
wcscpy_s(lf.lfFaceName, L"Terminal");
lf.lfCharSet = OEM_CHARSET;
EnumFontFamiliesEx(hdc, &lf, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)&availableSizes, 0);
ReleaseDC(GetConsoleWindow(), hdc);

遍历availableSizes找到和你需要的宽高比最接近的尺寸,传入SetCurrentConsoleFontEx即可实现非等比调整。

方案2:通过缓冲区与窗口尺寸配合实现拉伸效果

如果不想更换字体,可通过调整控制台缓冲区和窗口的行列数间接实现比例调整:

  • 固定窗口的物理像素尺寸
  • 若要实现Y轴压缩,可将控制台缓冲区的行数调高,相同物理高度下显示更多行内容,每个字符的显示高度会被对应压缩;要Y轴拉伸则降低缓冲区行数即可
  • 该方法不需要修改字体尺寸,仅需调用SetConsoleScreenBufferSize和SetConsoleWindowInfo调整参数即可

方案3:自定义等宽字体

如果需要完全自定义宽高比,可提前制作符合你需求比例的等宽字体,程序启动时临时注册到系统,再将控制台字体设置为你自定义的字体,之后设置dwFontSize.X和dwFontSize.Y即可按你指定的比例生效。

内容的提问来源于stack exchange,提问作者Yolo Gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:54:05