Bagikan melalui


Menggulir Konten Buffer Layar

Penting

Dokumen ini menjelaskan fungsionalitas platform konsol yang tidak lagi menjadi bagian dari peta jalan ekosistem kami. Kami tidak menyarankan penggunaan konten ini dalam produk baru, tetapi kami akan terus mendukung penggunaan yang ada untuk masa depan yang tidak terbatas. Solusi modern pilihan kami berfokus pada urutan terminal virtual untuk kompatibilitas maksimum dalam skenario lintas platform. Anda dapat menemukan informasi selengkapnya tentang keputusan desain ini di konsol klasik vs. dokumen terminal virtual kami.

Fungsi ScrollConsoleScreenBuffer memindahkan blok sel karakter dari satu bagian buffer layar ke bagian lain dari buffer layar yang sama. Fungsi menentukan sel kiri atas dan kanan bawah persegi panjang sumber yang akan dipindahkan dan koordinat tujuan lokasi baru untuk sel kiri atas. Data karakter dan warna dalam sel sumber dipindahkan ke lokasi baru, dan sel apa pun yang dibiarkan kosong oleh pemindahan diisi dengan karakter dan warna yang ditentukan. Jika persegi panjang kliping ditentukan, sel di luarnya dibiarkan tidak berubah.

ScrollConsoleScreenBuffer dapat digunakan untuk menghapus baris dengan menentukan koordinat sel pertama dalam baris sebagai koordinat tujuan dan menentukan persegi panjang gulir yang menyertakan semua baris di bawah baris.

Contoh berikut menunjukkan penggunaan persegi panjang kliping untuk menggulir hanya 15 baris bawah buffer layar konsol. Baris dalam persegi panjang yang ditentukan digulir ke atas satu baris sekaligus, dan baris atas blok dibuang. Konten buffer layar konsol di luar persegi panjang kliping dibiarkan tidak berubah.

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

Menggulir Jendela Buffer Layar

Menggulir Penyangga Layar