Прокрутка окна экранного буфера


Функция SetConsoleWindowInfo может быть использована для прокручивания содержания экранного буфера в консольном окне. Эта функция может к тому же изменить и размер окна. Функция может или задать новые верхние левые и нижние правые углы окна экранного буфера как абсолютные координаты экранного буфера или задать изменения от текущих координат окна. Функция терпит неудачу, если координаты определяемого окна находятся вне границ экранного буфера.

Нижеследующий пример прокручивает вид экранного буфера на одну строку, изменяя абсолютные координаты окна, возвращенные функцией GetConsoleScreenBufferInfo.

Обратите внимание! что MyErrorExit - групповой символ - заместитель для определяемой программой функции, которая показывает на экране и обрабатывает аварийные ситуации.

 

HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctWindow;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
// Получим размер текущего экранного буфера и позицию окна.
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
MyErrorExit("GetConsoleScreenBufferInfo");
// Установим в srctWindow размеры текущего окна и местоположение.
srctWindow = csbiInfo.srWindow;
// Если окно не вверху экранного буфера, переместим его вверх на одну строку.
if ( srctWindow.Top > 0 ) {
srctWindow.Top -= 1;    // перемещение вверх на одну строку
srctWindow.Bottom -= 1; // перемещение вниз на одну строку
if (! SetConsoleWindowInfo(
hStdout,      // дескриптор экранного буфера
TRUE,         // абсолютные координаты
&srctWindow)) // зададим новое место
MyErrorExit("SetConsoleWindowInfo");
}
 
Та же самая прокрутка может быть сделана определением изменений в координатах окна.
// Получим позицию текущего окна экранного буфера
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
MyErrorExit("GetConsoleScreenBufferInfo");
// Если окно не вверху экранного буфера, переместим его вверх на одну строку
if (csbiInfo.srWindow.Top > 0) {
srctWindow.Top = -1;    // перемещение вверх на одну строку
srctWindow.Bottom = -1; // перемещение вниз на одну строку
srctWindow.Left = 0;    // не изменяется
srctWindow.Right = 0;   // не изменяется
if (! SetConsoleWindowInfo(
hStdout,      // дескриптор экранного буфера
FALSE,        // небольшие изменения, не абсолютно
&srctWindow)) // зададим новое место
MyErrorExit("SetConsoleWindowInfo");
}


Назад в оглавление темы
На главную страницу темы

Hosted by uCoz