Scrollen im Inhalt eines Bildschirmpuffers

Wichtig

In diesem Dokument werden Konsolenplattformfunktionen beschrieben, die nicht mehr Teil unserer Ökosystem-Roadmap sind. Wir empfehlen nicht, diesen Inhalt in neuen Produkten zu verwenden, aber wir werden weiterhin vorhandene Nutzungen für die unbegrenzte Zukunft unterstützen. Unsere bevorzugte moderne Lösung konzentriert sich auf virtuelle Terminalsequenzen für maximale Kompatibilität in plattformübergreifenden Szenarien. Weitere Informationen zu dieser Designentscheidung finden Sie in unserem klassischen Konsolendokument im Vergleich zum virtuellen Terminal .

Die ScrollConsoleScreenBuffer-Funktion verschiebt einen Block von Zeichenzellen aus einem Teil eines Bildschirmpuffers in einen anderen Teil desselben Bildschirmpuffers. Die Funktion gibt die oberen linken und unteren rechten Zellen des Quellrechtecks an, die verschoben werden sollen, und die Zielkoordinaten der neuen Position für die obere linke Zelle. Die Zeichen- und Farbdaten in den Quellzellen werden an die neue Position verschoben, und alle Zellen, die durch die Verschiebung leer sind, werden mit einem angegebenen Zeichen und einer angegebenen Farbe ausgefüllt. Wenn ein Beschneidungsrechteck angegeben ist, bleiben die Zellen außerhalb des Rechtecks unverändert.

ScrollConsoleScreenBuffer kann verwendet werden, um eine Linie zu löschen, indem Koordinaten der ersten Zelle in der Zeile als Zielkoordinaten angegeben und ein Bildlaufrechteck angegeben wird, das alle Zeilen unterhalb der Zeile enthält.

Das folgende Beispiel zeigt die Verwendung eines Beschneidungsrechtecks, um nur die unteren 15 Zeilen des Konsolenbildschirmpuffers zu scrollen. Die Zeilen im angegebenen Rechteck werden jeweils um eine Zeile nach oben verschoben, und die oberste Zeile des Blocks wird aufgehoben Karte. Der Inhalt des Konsolenbildschirmpuffers außerhalb des Beschneidungsrechtecks bleibt unverändert.

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

Scrollen im Fenster eines Bildschirmpuffers

Scrollen in einem Bildschirmpuffer