Прокрутка содержимого буфера экрана
Важно!
В этом документе описаны функции платформы консоли, которые больше не являются частью стратегии развития экосистемы. Мы не рекомендуем использовать это содержимое в новых продуктах, но мы будем продолжать поддерживать существующие использования для неопределенного будущего. Наше предпочтительное современное решение ориентировано на последовательности виртуальных терминалов для обеспечения максимальной совместимости в кроссплатформенных сценариях. Дополнительные сведения об этом решении по проектированию можно найти в классической консоли и в документе виртуального терминала .
Функция ScrollConsoleScreenBuffer перемещает блок символьных ячеек из одной части буфера экрана в другую часть того же буфера экрана. Функция задает верхние и нижние правые ячейки исходного прямоугольника, которые будут перемещены, и координаты назначения нового расположения для левой верхней ячейки. Данные символа и цвета в исходных ячейках перемещаются в новое расположение, а все ячейки, оставшиеся пустыми при перемещении, заполняются указанным символом и цветом. Если указан прямоугольник обрезки, ячейки за ее пределами остаются неизменными.
ScrollConsoleScreenBuffer можно использовать для удаления строки, указав координаты первой ячейки в строке в качестве координат назначения и указав прокручиваемый прямоугольник, содержащий все строки под линией.
В следующем примере показано использование прямоугольника с вырезкой для прокрутки только нижних 15 строк буфера экрана консоли. Строки в указанном прямоугольнике прокручиваются по одной строке одновременно, а верхняя строка блока не карта. Содержимое буфера экрана консоли за пределами прямоугольника вырезки остается неизменным.
#include <windows.h>
#include <stdio.h>
int main( void )
{
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctScrollRect, srctClipRect;
CHAR_INFO chiFill;
COORD coordDest;
int i;
printf("\nPrinting 20 lines for reference. ");
printf("Notice that line 6 is discarded during scrolling.\n");
for(i=0; i<=20; i++)
printf("%d\n", i);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if (hStdout == INVALID_HANDLE_VALUE)
{
printf("GetStdHandle failed with %d\n", GetLastError());
return 1;
}
// Get the screen buffer size.
if (!GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
printf("GetConsoleScreenBufferInfo failed %d\n", GetLastError());
return 1;
}
// The scrolling rectangle is the bottom 15 rows of the
// screen buffer.
srctScrollRect.Top = csbiInfo.dwSize.Y - 16;
srctScrollRect.Bottom = csbiInfo.dwSize.Y - 1;
srctScrollRect.Left = 0;
srctScrollRect.Right = csbiInfo.dwSize.X - 1;
// The destination for the scroll rectangle is one row up.
coordDest.X = 0;
coordDest.Y = csbiInfo.dwSize.Y - 17;
// The clipping rectangle is the same as the scrolling rectangle.
// The destination row is left unchanged.
srctClipRect = srctScrollRect;
// Fill the bottom row with green blanks.
chiFill.Attributes = BACKGROUND_GREEN | FOREGROUND_RED;
chiFill.Char.AsciiChar = (char)' ';
// Scroll up one line.
if(!ScrollConsoleScreenBuffer(
hStdout, // screen buffer handle
&srctScrollRect, // scrolling rectangle
&srctClipRect, // clipping rectangle
coordDest, // top left destination cell
&chiFill)) // fill character and color
{
printf("ScrollConsoleScreenBuffer failed %d\n", GetLastError());
return 1;
}
return 0;
}