Condividi tramite


Scorrimento del contenuto di un buffer dello schermo

Importante

Questo documento descrive le funzionalità della piattaforma della console che non fanno più parte della roadmap dell'ecosistema. Non è consigliabile usare questo contenuto nei nuovi prodotti, ma continueremo a supportare gli utilizzi esistenti per il futuro indefinito. La soluzione moderna preferita è incentrata sulle sequenze di terminale virtuale per garantire la massima compatibilità negli scenari multipiattaforma. Per altre informazioni su questa decisione di progettazione, vedere il documento relativo alla console classica e al terminale virtuale.

La funzione ScrollConsoleScreenBuffer sposta un blocco di celle di caratteri da una parte di un buffer dello schermo a un'altra parte dello stesso buffer dello schermo. La funzione specifica le celle superiore sinistra e inferiore destra del rettangolo di origine da spostare e le coordinate di destinazione della nuova posizione per la cella superiore sinistra. I dati di carattere e colore nelle celle di origine vengono spostati nella nuova posizione e tutte le celle lasciate vuote dallo spostamento vengono riempite con un carattere e un colore specificati. Se viene specificato un rettangolo di ritaglio, le celle esterne vengono lasciate invariate.

ScrollConsoleScreenBuffer può essere usato per eliminare una riga specificando le coordinate della prima cella della riga come coordinate di destinazione e specificando un rettangolo di scorrimento che include tutte le righe sotto la riga.

Nell'esempio seguente viene illustrato l'uso di un rettangolo di ritaglio per scorrere solo le 15 righe inferiori del buffer dello schermo della console. Le righe nel rettangolo specificato vengono scorrete verso l'alto di una riga alla volta e la riga superiore del blocco viene rimossa. Il contenuto del buffer dello schermo della console all'esterno del rettangolo di ritaglio rimane invariato.

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

Scorrimento della finestra di un buffer dello schermo

Scorrimento del buffer dello schermo