2016-02-20 2 views
0

Я пытаюсь изменить размер консоли с помощью WinApi, я преуспел в изменении размера окна и т. Д., Но когда я печатаю на консоли, я не получаю всю информацию, напечатанную на консоли окно, и я не могу понять, почему это происходит? Когда я удаляю код изменения размера, все работает нормально. Я думаю, проблема связана с тем, что размер консольного буфера мал. SetConsoleSize (int, int) называется первым в основном.Проблемы с консольным буфером при изменении размера консоли (WinAPI)

#include <iostream> 
#include <stdexcept> 
#include <windows.h> 

static void SetConsoleSize(int x, int y) { 
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleTitle("Title!"); 

COORD coordinates; 
coordinates.X = x; 
coordinates.Y = y; 

SMALL_RECT windowRect; 
windowRect.Top = 0; 
windowRect.Left = 0; 
windowRect.Bottom = x - 1; 
windowRect.Right = y - 1; 

// Adjust buffer size: 
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 
if (!SetConsoleScreenBufferSize(handle, coordinates)) 
    throw std::runtime_error("Unable to resize screen buffer."); 

// display as a maximized window 
ShowWindow(GetConsoleWindow(), SW_MAXIMIZE); 
} 
+0

Трудно точно знать, из вашего описания какова ваша проблема. Возможно, добавьте скриншот, показывающий, что вы видите и чего ожидаете. –

ответ

0

Информация в окне была перезаписана, поскольку буфер для окна консоли был двумя небольшими, см. Координаты COORD, которые определяют размер буфера окна консоли.

код Решения ниже, заметят, что различные размеры экрана может вызвать проблемы, так как нет никакого кода для Eval размера экрана только происхождения {0,0} как начальное положение:

static void SetConsoleSize() { 
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleTitle("Title); 

CONSOLE_SCREEN_BUFFER_INFO sbInfo; 
GetConsoleScreenBufferInfo(hStdOut, &sbInfo); 

COORD coordinates; 
coordinates.X = 80; // size of line. 
coordinates.Y = 1000; //Number of lines. 

SMALL_RECT windowRect; 
windowRect.Top = 0; 
windowRect.Left = 0; 
windowRect.Bottom = 40; 
windowRect.Right = 79; 

//set textbuffer size 
assert(SetConsoleScreenBufferSize(hStdOut, coordinates)); 

//change window size. 
assert(SetConsoleWindowInfo(hStdOut, true, &windowRect)); 

const HWND hwnd = GetConsoleWindow(); 

SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE); //Positioning the window 
} 
Смежные вопросы