滚动屏幕缓冲区的内容
重要
本文档介绍控制台平台功能,该功能已不再是生态系统蓝图的一部分。 我们不建议在新产品中使用此内容,但我们未来将无限期支持现有使用。 我们的首选最新解决方案侧重于虚拟终端序列,以实现跨平台方案中的最大兼容性。 有关此设计决策的详细信息,请参阅经典控制台与虚拟终端文档。
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;
}