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
相关产品推荐
相关产品推荐

