Compartilhar via


Rolar o conteúdo de um buffer de tela

Importante

Este documento descreve a funcionalidade da plataforma do console que não faz mais parte do nosso roteiro de ecossistema. Não recomendamos o uso desse conteúdo em novos produtos, mas continuaremos a oferecer suporte aos usos existentes por tempo indeterminado. Nossa solução moderna preferida se concentra em sequências de terminais virtuais para máxima compatibilidade em cenários de multiplataforma. Você pode encontrar mais informações sobre essa decisão de design em nosso documento Console clássico versus terminal virtual.

A função ScrollConsoleScreenBuffer move um bloco de células de caracteres de uma parte de um buffer de tela para outra parte do mesmo buffer de tela. A função especifica as células superior esquerda e inferior direita do retângulo de origem a ser movido e as coordenadas de destino do novo local para a célula superior esquerda. Os dados de caracteres e cores nas células de origem são movidos para o novo local, e todas as células deixadas vazias pela movimentação são preenchidas com caractere e cor especificados. Se um retângulo de corte for especificado, as células fora dele permanecem inalteradas.

ScrollConsoleScreenBuffer pode ser usado para excluir uma linha ao especificar coordenadas da primeira célula na linha como as coordenadas de destino e ao especificar um retângulo de rolagem contendo todas as linhas abaixo da linha.

O exemplo a seguir mostra o uso de um retângulo de corte para rolar somente as 15 linhas inferiores do buffer de tela do console. As linhas no retângulo especificado são roladas para cima uma linha de cada vez e a linha superior do bloco é descartada. O conteúdo do buffer de tela do console fora do retângulo de corte fica inalterado.

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

Rolar a janela de um buffer de tela

Rolar o buffer de tela