画面バッファーの内容のスクロール
重要
このドキュメントでは、エコシステム ロードマップの一部ではなくなったコンソール プラットフォームの機能について説明します。 このコンテンツを新しい製品で使用することはお勧めしませんが、今後も既存の使用をサポートし続けます。 推奨される最新のソリューションでは、クロスプラットフォーム シナリオでの互換性を最大限に高める仮想ターミナル シーケンスに重点を置いています。 この設計決定の詳細については、クラシック コンソールと仮想ターミナルのドキュメントを参照してください。
ScrollConsoleScreenBuffer 関数は、文字セルのブロックをスクリーン バッファーのある部分から同じスクリーン バッファーの別の部分に移動します。 この関数は、移動するソース四角形の左上と右下のセルと、左上のセルの新しい位置の移動先座標を指定します。 ソース セルの文字データと色データは新しい場所に移動させられ、移動によって空のセルが指定された文字と色で塗りつぶされます。 クリッピング四角形が指定されている場合、その外側のセルは変更されません。
ScrollConsoleScreenBuffer を使用すると、行の最初のセルの座標を変換先の座標として指定し、行の下にあるすべての行を含むスクロール四角形を指定することで、線を削除できます。
次の例は、クリッピング四角形を使用して、コンソール スクリーン バッファーの下部 15 行のみをスクロールする方法を示しています。 指定した四角形内の行は一度に 1 行上にスクロールされ、ブロックの一番上の行はディスカードされます。 クリッピング四角形の外側にあるコンソール スクリーン バッファーの内容は変更されません。
#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;
}