Desplazamiento por el contenido de un búfer de pantalla

Importante

En este documento se describe funcionalidad de la plataforma de consola que ya no forma parte de nuestro plan de desarrollo del ecosistema. No se recomienda usar este contenido en nuevos productos, pero seguiremos admitiendo los usos existentes en un futuro indefinido. Nuestra solución moderna preferida se centra en secuencias de terminal virtual para lograr la máxima compatibilidad en escenarios multiplataforma. Puede encontrar más información sobre esta decisión de diseño en nuestro documento de Comparación de consola clásica y terminal virtual.

La función ScrollConsoleScreenBuffer mueve un bloque de celdas de caracteres de una parte a otra de un búfer de pantalla. La función especifica las celdas superior izquierda e inferior derecha del rectángulo de origen que se va a mover y las coordenadas de destino de la nueva ubicación de la celda superior izquierda. Los datos de caracteres y colores de las celdas de origen se mueven a la nueva ubicación, y las celdas que quedan vacías debido a este movimiento se rellenan con un carácter y un color especificados. Si se especifica un rectángulo de recorte, las celdas que quedan fuera de él se mantienen sin cambios.

ScrollConsoleScreenBuffer se puede utilizar para eliminar una línea. Para ello, especifique las coordenadas de la primera celda de la línea como coordenadas de destino, y un rectángulo de desplazamiento que incluya todas las filas que quedan debajo de la línea.

En el ejemplo siguiente se muestra el uso de un rectángulo de recorte para desplazar solo las 15 filas inferiores del búfer de pantalla de consola. Las filas del rectángulo especificado se desplazan a la vez una línea hacia arriba y se descarta la fila superior del bloque. El contenido del búfer de pantalla de consola que queda fuera del rectángulo de recorte se mantiene sin cambios.

#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;
}

Desplazamiento por la ventana de un búfer de pantalla

Desplazamiento del búfer de pantalla