Поделиться через


Прокрутка содержимого буфера экрана

Важно!

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

Функция 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;
}

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

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