Partager via


Défilement du contenu d’une mémoire tampon d’écran

Important

Ce document décrit les fonctionnalités de la plateforme de la console qui ne font plus partie de la feuille de route de notre écosystème. Nous vous déconseillons d’utiliser ce contenu dans de nouveaux produits, mais nous continuerons à prendre en charge des utilisations existantes pour l’avenir indéterminé. Notre solution moderne préférée se concentre sur les séquences de terminaux virtuels pour une compatibilité maximale dans les scénarios multiplateformes. Vous trouverez plus d’informations sur cette décision de conception dans notre document sur les consoles classiques et les terminaux virtuels.

La fonction ScrollConsoleScreenBuffer déplace un bloc de cellules de caractères d’une partie d’une mémoire tampon d’écran à une autre partie de la même mémoire tampon d’écran. La fonction spécifie les cellules supérieure gauche et inférieure droite du rectangle source à déplacer et les coordonnées de destination du nouvel emplacement pour la cellule supérieure gauche. Les données de caractères et de couleurs dans les cellules sources sont déplacées vers le nouvel emplacement, et les cellules laissées vides par le déplacement sont remplies avec un caractère et une couleur spécifiés. Si un rectangle d'écrêtage est spécifié, les cellules situées à l'extérieur de ce rectangle restent inchangées.

La fonction ScrollConsoleScreenBuffer peut être utilisée pour supprimer une ligne en spécifiant les coordonnées de la première cellule de la ligne comme coordonnées de destination et en spécifiant un rectangle de défilement qui inclut toutes les lignes situées en dessous de la ligne.

L'exemple suivant montre l'utilisation d'un rectangle d'écrêtage pour faire défiler uniquement les 15 dernières lignes de la mémoire tampon de l'écran de la console. Les lignes du rectangle spécifié défilent vers le haut d'une ligne à l'autre et la ligne supérieure du bloc est ignorée. Le contenu de la mémoire tampon de l’écran de la console s’étend au-delà de la limite du rectangle d'écrêtage reste inchangé.

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

Défilement de la fenêtre d’une mémoire tampon d’écran

Défilement de la mémoire tampon d’écran