Прокрутка содержания экранного буфера
Функция 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); // заполнение символами и цветом |