捲動畫面緩衝區的內容
重要
本文件說明已不再是生態系統 藍圖一部分的控制台平臺功能。 我們不建議您在新產品中使用此內容,但我們將繼續支持無限期的未來現有使用量。 我們慣用的新式解決方案著重於 虛擬終端機序列 ,以在跨平臺案例中達到最大相容性。 您可以在傳統 主控台與虛擬終端機 檔中找到此設計決策的詳細資訊。
ScrollConsoleScreenBuffer 函式會將字元儲存格區塊從螢幕緩衝區的某個部分移至相同螢幕緩衝區的另一個部分。 函式會指定要移動之來源矩形的左上方和右下角單元格,以及左上方儲存格之新位置的目的地座標。 源數據格中的字元和色彩數據會移至新位置,移動所留下的任何儲存格會填入指定的字元和色彩。 如果指定裁剪矩形,則其外部的儲存格會保持不變。
ScrollConsoleScreenBuffer 可用來刪除線條,方法是指定線條中第一個單元格的座標做為目的座標,並指定包含線條下所有數據列的捲動矩形。
下列範例示範如何使用裁剪矩形,只捲動控制台畫面緩衝區的下15個數據列。 指定矩形中的數據列會一次向上捲動一行,並捨棄區塊的頂端數據列。 裁剪矩形外控制台畫面緩衝區的內容保持不變。
#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;
}