【问题标题】:Windows Console Resizing ignored - Screen buffer messed upWindows 控制台调整大小被忽略 - 屏幕缓冲区搞砸了
【发布时间】:2019-07-29 09:20:49
【问题描述】:

我要问和我之前无数人一样的问题。我已经尝试了所有的解决方案,但我每次都希望得到相同的输出。我正在创建一个控制台游戏引擎,并希望通过使用 Windows API 来提高 fps。但是,现在我已经实现了旋转多边形和这样的实现,我意识到当请求的大小扩展大约 100 x 100 个字符时,控制台会自行调整大小。发生这种情况时,控制台的大小会调整为大约 50 x 25,当我向右滚动时,屏幕缓冲区会显示绝对乱码。

以下是一些图片:

我现在只提供相关代码,但如果有人需要,我很乐意添加。

m_width = width;
m_height = height;

m_hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
m_hConsoleIn = GetStdHandle(STD_INPUT_HANDLE);

if (m_hConsole == INVALID_HANDLE_VALUE)
    log += "Invalid std output console handle\n";

COORD bottemRight = { (signed)width, (signed)height };

if (!SetConsoleScreenBufferSize(m_hConsole, bottemRight))
    log += "Error setting screen size\n";

m_screenBound = { 0, 0, (signed)width - 1, (signed)height - 1 };
if (!SetConsoleWindowInfo(m_hConsole, TRUE, &m_screenBound))
    log += "Error initializing window info\n";

if (!SetConsoleActiveScreenBuffer(m_hConsole))
    log += "Error setting active screen buffer\n";

我也尝试过 HWND 解决方案:

HWND hwnd = GetConsoleWindow();
RECT rect = { 0, 0, width, height };
MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top);

我尝试切换窗口信息设置器和屏幕缓冲区大小设置器并将窗口信息矩形更改为 {0, 0, 1, 1} 以不占优势。输出与您在上面的图片中看到的几乎完全相同。 提前致谢!

【问题讨论】:

  • 请查看SetConsoleScreenBufferSize functiondocument: "指定的宽度和高度不能小于控制台屏幕缓冲区窗口的宽度和高度。指定的尺寸也不能小于最小值系统允许的大小。此最小值取决于控制台的当前字体大小(由用户选择)以及GetSystemMetrics 函数返回的SM_CXMINSM_CYMIN 值。"
  • 如果这个函数SetConsoleScreenBufferSize失败调用GetLastError获取错误码。
  • 这是否意味着我必须将窗口大小设置为 { 0, 0, 1, 1 },然后设置控制台缓冲区,最后将窗口设置为 { 0, 0, width -1, height - 1 }?
  • GetSystemMetrics(SM_CXMIN)GetSystemMetrics(SM_CYMIN) 的返回值是什么?
  • 它返回 136、39。我不知道这些数字是什么意思,但如果它们与字体大小相关,那么您可能会在这里找到一些东西

标签: c++ winapi windows-console


【解决方案1】:

已解决

在对我的代码进行了一番研究之后,事实证明(基于 Microsoft 文档)我需要这样的东西:

SMALL_RECT screen = { 0, 0, 1, 1 };
SetConsoleWindowInfo(m_handle, true, &screen);

COORD buffer_size = { width, height };
SetConsoleScreenBufferSize(m_handle, &buffer_size);

screen = { 0, 0, width - 1, height - 1 };
SetConsoleWindowInfo(m_handle, &screen);

这对我有用,但感谢您的建议!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多