Я знаю, что есть много вопросов о том, как установить размер консоли. Но все найденные решения одинаковы для моего, и мой код не работает для меня.Установить размер окна консоли на Windows
Хорошо, поэтому для установки размера окна консоли мне нужны две функции. Это SetConsoleScreenBufferSize() и SetConsoleWindowInfo(). Первая версия моей функции:
bool SetWindowSize(size_t width, size_t height)
{
HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
if(output_handle == INVALID_HANDLE_VALUE)
return false;
COORD coord = {};
coord.X = static_cast<SHORT>(width);
coord.Y = static_cast<SHORT>(height);
if(::SetConsoleScreenBufferSize(output_handle, coord) == FALSE)
return false;
SMALL_RECT rect = {};
rect.Bottom = coord.X - 1;
rect.Right = coord.Y - 1;
return (::SetConsoleWindowInfo(output_handle, TRUE, &rect) != FALSE);
}
SetConsoleScreenBufferSize()
будет работать не для всех значений. Из документации:
Указанная ширина и высота не может быть меньше, чем ширина и высота окна консольного ЭКРАН буфера
Позволяет попытаться получить размер текущего окна и вызвать нашу функцию. Чтобы получить размер окна, мне нужна функция GetConsoleScreenBufferInfo(). основной (код) испытания:
HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
if(output_handle == INVALID_HANDLE_VALUE)
return 0;
CONSOLE_SCREEN_BUFFER_INFO info = {};
if(::GetConsoleScreenBufferInfo(output_handle, &info) == FALSE)
return 0;
size_t width = info.srWindow.Right - info.srWindow.Left;
size_t height = info.srWindow.Bottom - info.srWindow.Top;
bool suc = SetWindowSize(width + 1, height + 1);
В этом случае SetConsoleScreenBufferSize()
работает отлично. Следующая функция: SetConsoleWindowInfo()
. Эта функция будет работать в следующих случаях:
Функция не работает, если указанный прямоугольник окна выходит за пределы оконного буфера консоли, за пределами . Это означает, что
Top
иLeft
членыlpConsoleWindow
прямоугольника (или вычисленные верхние и левые координаты, еслиbAbsolute
ЛОЖЬ) не может быть меньше, чем нуль. Аналогично, членыBottom
иRight
(или вычисленные нижние и правые координаты ) не могут быть больше (буфер экранаheight – 1
) и (буфер экранаwidth – 1
) соответственно. Функция также не выполняется, еслиRight
член (или рассчитываются правая координата) составляет меньше или равенLeft
элемента (или рассчитываются влево координаты) или еслиBottom
элемента (или вычисляются нижняя координата) меньше, чем или равно членTop
(или расчетная верхняя координата).
В нашем случае, значение прямоугольника является одинаковым (потому что Left
и Top
равны нуль) в качестве значений info.srWindow
прямоугольника после вызова GetConsoleScreenBufferInfo()
. Но! SetConsoleWindowInfo()
терпит неудачу с следующий ::GetLastError()
@err,hr ERROR_INVALID_PARAMETER : The parameter is incorrect. unsigned int
Если я поменять вызовы этих двух функций:
bool SetWindowSize(size_t width, size_t height)
{
HANDLE output_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
if(output_handle == INVALID_HANDLE_VALUE)
return false;
SMALL_RECT rect = {};
rect.Bottom = static_cast<SHORT>(width);
rect.Right = static_cast<SHORT>(height);
if(::SetConsoleWindowInfo(output_handle, TRUE, &rect) == FALSE)
return false;
COORD coord = {};
coord.X = rect.Bottom + 1;
coord.Y = rect.Right + 1;
return (::SetConsoleScreenBufferSize(output_handle, coord) != FALSE);
}
тогда я буду иметь ту же ошибку.
Итак, как я могу правильно использовать SetConsoleScreenBufferSize()
и SetConsoleWindowInfo()
?
'станд :: min' и' станд :: max' славные функции. вы можете использовать их для вычисления соответствующего промежуточного размера буфера и/или окна. не забудьте указать 'NOMINMAX' перед включением' '. –
@ Cheersandhth.-Alf, ваш комментарий не поможет. Я знаю, как использовать функции min и max. Скажите мне, как вычислить соответствующий промежуточный размер буфера и/или окна для использования обеих функций для установки размера буфера экрана и размера окна. – grisha
@userblahblah: re «не полезно», прекратите * ныть * и пойдете. Я делал это несколько раз. поэтому я знаю, что это тривиально, это просто работа. поэтому, чтобы повторить, перестань ныть. продолжай. –