Изменение размера консоли Windows игнорируется - буфер экрана испорчен

Я собираюсь задать тот же вопрос, что и бесчисленное множество людей до меня. Я пробовал каждое решение, но каждый раз получаю один и тот же результат. Я создаю консольный игровой движок и хочу улучшить частоту кадров с помощью Windows API. Однако теперь, когда у меня есть вращающиеся полигоны и тому подобное, я понимаю, что консоль изменяет свой размер, когда запрошенный размер увеличивается примерно на 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}, чтобы не превалировать. Результат почти такой же, как вы видите на картинках выше. Заранее спасибо!


person J. Lengel    schedule 29.07.2019    source источник
comment
Пожалуйста, проверьте документ SetConsoleScreenBufferSize function: указанные ширина и высота не могут быть меньше, чем ширина и высота окна экранного буфера консоли. Указанные размеры также не могут быть меньше минимального размера, разрешенного системой. Этот минимум зависит от текущего размера шрифта для консоли (выбранного пользователем) и значений SM_CXMIN и SM_CYMIN, возвращаемых функцией GetSystemMetrics.   -  person Rita Han    schedule 30.07.2019
comment
Если эта функция SetConsoleScreenBufferSize не работает, вызовите GetLastError, чтобы получить код ошибки.   -  person Rita Han    schedule 30.07.2019
comment
Означает ли это, что я должен установить размер окна на {0, 0, 1, 1}, затем установить буфер консоли и, наконец, установить окно на {0, 0, ширина -1, высота - 1}?   -  person J. Lengel    schedule 31.07.2019
comment
Каковы для вас возвращаемые значения GetSystemMetrics(SM_CXMIN) и GetSystemMetrics(SM_CYMIN)?   -  person Rita Han    schedule 05.08.2019
comment
он возвращает 136, 39. Я не знаю, что означают эти числа, но если они коррелируют с размером шрифта, возможно, вы что-то здесь понимаете.   -  person J. Lengel    schedule 05.08.2019
comment
Эти цифры означают минимальный размер, разрешенный системой. Ваш размер 50 x 25 слишком мал, чтобы его можно было разрешить. Вам нужно использовать больший размер, чем 136 x 39. Например, вы можете попробовать 140 x 45, чтобы увидеть, поможет ли это.   -  person Rita Han    schedule 06.08.2019
comment
это ничего не меняет. Он по-прежнему изменяет размер примерно до 50x100.   -  person J. Lengel    schedule 06.08.2019
comment
@ Я не могу воспроизвести эту проблему. Вы можете обратиться к официальному образцу или предоставьте небольшой, полный и воспроизводимый пример кода, чтобы я мог попытаться воспроизвести.   -  person Rita Han    schedule 08.08.2019


Ответы (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);

Это работает для меня сейчас, но спасибо за ваши предложения!

person J. Lengel    schedule 26.08.2019