滚动屏幕缓冲区

重要

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

控制台窗口显示活动屏幕缓冲区的一部分。 每个屏幕缓冲区维护各自的当前窗口矩形,该矩形指定要显示在控制台窗口中的左上和右下字符单元的坐标。 若要确定屏幕缓冲区的当前窗口矩形,请使用 GetConsoleScreenBufferInfo 函数。 创建屏幕缓冲区时,窗口的左上角位于控制台屏幕缓冲区的左上角 (0,0) 处。

窗口矩形可以变化以显示控制台屏幕缓冲区的不同部分。 屏幕缓冲区的窗口矩形在下列情况中可能会变化:

  • 调用 SetConsoleWindowInfo 以指定新的窗口矩形时,它会通过更改窗口矩形的位置而不更改窗口大小来滚动控制台屏幕缓冲区的视图。 有关滚动窗口内容的示例,请参阅滚动屏幕缓冲区的窗口

    screen buffer window panning around large buffer of content

  • 当使用 WriteFile 函数写入到屏幕缓冲区并启用行尾换行 (EOL) 输出模式时,窗口矩形会自动移动,因此始终显示光标。

  • SetConsoleCursorPosition 函数指定的新光标位置在当前窗口矩形的边界之外时,窗口矩形会自动移动以显示光标。

  • 当用户更改控制台窗口的大小或使用窗口的滚动条时,活动屏幕缓冲区的窗口矩形可能会变化。 这种变化不会报告为输入缓冲区中的窗口大小调整事件。

在上述每种情况下,窗口矩形将移动以显示控制台屏幕缓冲区的不同部分,但控制台屏幕缓冲区的内容保持在相同位置。 下列情况可能导致控制台屏幕缓冲区的内容发生移动:

  • 调用 ScrollConsoleScreenBuffer 函数时,将矩形块从屏幕缓冲区的一部分复制到另一部分。
  • 使用 WriteFile 在启用行尾换行输出模式的情况下写入到屏幕缓冲区时,如果遇到控制台屏幕缓冲区的末尾,控制台屏幕缓冲区的内容会自动滚动。 此滚动会弃用控制台屏幕缓冲区的顶部行。

ScrollConsoleScreenBuffer 指定移动的控制台屏幕缓冲区矩形以及将矩形复制到的新左上坐标。 此函数可以滚动控制台屏幕缓冲区的一部分或完整内容。

此图显示了 ScrollConsoleScreenBuffer 操作,该操作可将控制台屏幕缓冲区的完整内容向上滚动几行。 顶部行的内容被弃用,底部行填充为指定的字符和颜色。

screen buffer window scrolling content off top to discard

ScrollConsoleScreenBuffer 的效果可以通过指定可选的剪辑矩形来限制,以使剪辑矩形外的控制台屏幕缓冲区内容保持不变。 剪辑的效果是创建一个子窗口(剪辑矩形),其内容滚动而不影响控制台屏幕缓冲区的其余部分。 有关使用 ScrollConsoleScreenBuffer 的示例,请参阅滚动屏幕缓冲区的内容