Как изменить размер консольного окна?

388
25 января 2018, 19:35

Как изменить размер консольного окна?

HWND console = GetConsoleWindow();
RECT r;
GetWindowRect(console, &r); //stores the console's current dimensions
MoveWindow(console, r.left, r.top, 800, 100, TRUE); // 800 width, 100 height

Работает лишь по вертикали.

Answer 1

Ну, в Delphi, когда нужно ручками поменять размер консоли, я использую давно написанную функцию:

function SetConsoleSize(newx,newy:integer):integer;
var
  Rect: TSmallRect;
  MaxSize,Coord: TCoord;
begin
  MaxSize:=GetLargestConsoleWindowSize(GetStdHandle(STD_OUTPUT_HANDLE));
  if (newx > MaxSize.X) or ((newx > MaxSize.X)) then
     begin
      Result:=-1; // возвращаем -1, если пытаемся задать очень большой размер
      exit;
     end;
  Rect.Left := 1;
  Rect.Top := 1;
  Rect.Right := newx+1;
  Rect.Bottom := newy+1;
  Coord.X := Rect.Right + 1 - Rect.Left; // размеры окна должны быть хотя бы на 1 меньше буфера
  Coord.y := Rect.Bottom + 1 - Rect.Top;
  SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), Coord); // выставляем размер буфера
  Result:=integer(SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), True, Rect)); // выставляем размер окна
end;

Понимаю, что ответ должен быть на C++, но на этой машине нет С++, проверить правильность кода не могу, поэтому сейчас дам пояснения, чтобы легко можно было перевести с Delphi на C++.

Вначале нам необходимо определить максимально возможный размер окна. Делаем это функцией COORD WINAPI GetLargestConsoleWindowSize(HANDLE hConsoleOutput);, передавая в качестве параметра handle нашего окна, получая в COORD макс значения X и Y. Структура COORD:

typedef struct _COORD {
  SHORT X;
  SHORT Y;
} COORD, *PCOORD;

Если всё в порядке, нужно задать координаты, для этого используется структура SMALL_RECT:

typedef struct _SMALL_RECT {
  SHORT Left;
  SHORT Top;
  SHORT Right;
  SHORT Bottom;
} SMALL_RECT;

и новый размер буфера (опять-таки через COORD). Нужно помнить, чтобы новые размеры были применены успешно, размер буфера должен быть хотя бы на 1 больше, чем размер окна. Дальше просто: используем функции BOOL WINAPI SetConsoleScreenBufferSize(_In_ HANDLE hConsoleOutput, COORD dwSize); для задания нового размера буфера и BOOL WINAPI SetConsoleWindowInfo(HANDLE hConsoleOutput, BOOL bAbsolute, const SMALL_RECT *lpConsoleWindow); для задания нового размера. Возвращаем результат, если нужно.

READ ALSO
Пересечение треугольника и шара. С++

Пересечение треугольника и шара. С++

Есть игрок в виде шара и есть множество треугольниковУ каждого треугольника есть 3 точки

276
Как перенести на новую строку не возвращая каретку?

Как перенести на новую строку не возвращая каретку?

В c++ перенос строки осуществляется через \n но он так-же переносит каретку в исходное состояние, пример:

227
Uniform initialization

Uniform initialization

В С++11 появился новый синтаксис инициализацииВот что по этому поводу пишет Скотт Майерс в книге Effective Modern C++:

228
NumberLong mongoDb java

NumberLong mongoDb java

Как в записать в mongo строку "1509137313000" что бы в базе она отображалась вот так

272