Прокрутка содержания экранного буфера
Функция ScrollConsoleScreenBuffer перемещает блок символьных знакомест из одной части экранного буфера в другую часть того же самого экранного буфера. Функция устанавливает верхние левые и нижние правые ячейки исходного прямоугольника, который будет перемещен и координаты назначения нового местоположения для верхней левой ячейки. Символ и данные о цвете в исходных ячейках перемещаются в новое место, а любые ячейки, оставленные пустыми при перемещении, заполняются заданным символом и цветом. Если задается прямоугольник отсечения по границам, ячейки вне него остаются неизменными.
Функция ScrollConsoleScreenBuffer может быть использована для удаления строки, при помощи установки координат первой ячейки в строке как координаты назначения и установки прямоугольника прокрутки, который включает в себя все строки ниже этой строки.
Нижеследующий пример выводит на экран использование прямоугольника отсечения по границам, чтобы прокрутить только нижние 15 строк экранного буфера консоли. Строки в определяемом прямоугольнике прокручиваются вверх по одной строке за раз, а верхняя строка блока отбрасывается. Содержание экранного буфера консоли вне прямоугольника отсечения по границам остается неизменным.
|
Обратите внимание! на то, что MyErrorExit - групповой символ - заместитель для определяемой программой функции, которая показывает на экране и обрабатывает аварийные ситуации. |
HANDLE hStdout;
BOOL fSuccess;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdout == INVALID_HANDLE_VALUE)
MyErrorExit("GetStdHandle");
// Получим размер экранного буфера.
fSuccess = GetConsoleScreenBufferInfo(hStdout, &csbiInfo);
if (! fSuccess)
MyErrorExit("GetConsoleScreenBufferInfo");
// Прямоугольник прокручивания содержит 15 нижних строчек экранного буфера.
srctScrollRect.Top = csbiInfo.dwSize.Y - 16;
srctScrollRect.Bottom = csbiInfo.dwSize.Y - 1;
srctScrollRect.Left = 0;
srctScrollRect.Right = csbiInfo.dwSize.X - 1;
// Назначение прокручивания в прямоугольнике по одной строке вверх.
coordDest.X = 0;
coordDest.Y = csbiInfo.dwSize.Y - 17;
// Прямоугольник отсечения - такой же самый, что и прямоугольник прокручивания.
// Строка назначения остается неизменной srctClipRect = srctScrollRect; // Заполним нижнюю строку зелеными пробелами. chiFill.Attributes = BACKGROUND_GREEN | FOREGROUND_RED; chiFill.Char.AsciiChar = ' '; // Прокрутим вверх одну строку.
fSuccess = ScrollConsoleScreenBuffer(
hStdout, // дескриптор экранного буфера
&srctScrollRect, // прямоугольник прокрутки
&srctClipRect, // прямоугольник отсечения по границам
coordDest, // верхняя левая ячейка назначения
&chiFill); // заполнение символами и цветом
|