控制台屏幕缓冲区

屏幕缓冲区是用于控制台窗口中输出的字符和颜色数据的二维数组。 控制台可以有多个屏幕缓冲区。 活动屏幕缓冲区是在屏幕上显示的缓冲区。

每当系统创建新主机时,系统会创建屏幕缓冲区。 若要打开主机的活动屏幕缓冲区的句柄,请在调用 CreateFile 函数时指定 CONOUT$ 值。 进程可以使用 CreateConsoleScreenBuffer 函数为其控制台创建其他屏幕缓冲区。 在 对 SetConsoleActiveScreenBuffer 函数的调用中指定新屏幕缓冲区之前,新屏幕缓冲区才会处于活动状态。 但是,无论它们处于活动状态还是非活动,都可以访问屏幕缓冲区进行读取和写入。

每个屏幕缓冲区都有自己的二维字符信息记录数组。 每个字符的数据存储在 一个CHAR_INFO 结构中,该结构指定 Unicode 或 ANSI 字符以及显示该字符的前景和背景色。

可以为每个屏幕缓冲区单独设置与屏幕缓冲区关联的许多属性。 这意味着更改活动屏幕缓冲区可能会对控制台窗口的外观产生戏剧性的影响。 与屏幕缓冲区关联的属性包括:

  • 屏幕缓冲区大小,以字符行和列为单位。
  • 文本属性(用于显示 由 WriteFileWriteConsole 函数写入的文本的前景色和背景色)。
  • 窗口大小和位置(控制台窗口中显示的控制台屏幕缓冲区的矩形区域)。
  • 光标位置、外观和可见性。
  • 输出模式(ENABLE_PROCESSED_OUTPUTENABLE_WRAP_AT_EOL_OUTPUT)。 有关控制台输出模式的详细信息,请参阅 High-Level 控制台模式

创建屏幕缓冲区时,它包含每个位置的空间字符。 它的光标可见,并定位在缓冲区的原点(0,0),窗口位于缓冲区的原点处,其左上角位于缓冲区的原点。 控制台屏幕缓冲区的大小、窗口大小、文本属性和光标的外观由用户或系统默认值确定。 若要检索与控制台屏幕缓冲区关联的各种属性的当前值,请使用 GetConsoleScreenBufferInfoGetConsoleCursorInfoGetConsoleMode 函数。

更改任何控制台屏幕缓冲区属性的应用程序应创建自己的屏幕缓冲区,或在启动期间保存继承的屏幕缓冲区的状态,并在退出时还原它。 此合作行为是必需的,以确保共享同一控制台会话的其他应用程序不受更改的影响。

小窍门

建议尽可能使用 备用缓冲区模式 ,而不是为此创建第二个屏幕缓冲区。 备用缓冲区模式 可提高远程设备和与其他平台的兼容性。 有关详细信息,请参阅有关 经典控制台 API 与虚拟终端 的讨论。

光标外观和位置

屏幕缓冲区的光标可以可见或隐藏。 当它可见时,其外观可能会有所不同,从完全填充字符单元格到显示为单元格底部的水平线不等。 若要检索有关游标的外观和可见性的信息,请使用 GetConsoleCursorInfo 函数。 此函数报告游标是否可见,并将游标的外观描述为它填充的字符单元格的百分比。 若要设置游标的外观和可见性,请使用 SetConsoleCursorInfo 函数。

由高级控制台 I/O 函数编写的字符在当前游标位置写入,将光标提升到下一个位置。 若要确定屏幕缓冲区坐标系中的当前光标位置,请使用 GetConsoleScreenBufferInfo。 可以使用 SetConsoleCursorPosition 设置光标位置,从而控制由高级 I/O 函数写入或回显的文本的位置。 如果移动游标,则覆盖新游标位置的文本。

注释

不建议使用低级别函数查找游标位置。 如果高级布局需要,建议使用 虚拟终端序列 来查询此位置。 有关首选虚拟终端序列的详细信息,请参阅 经典函数与虚拟终端 文档。

游标的位置、外观和可见性为每个屏幕缓冲区单独设置。

字符属性

字符属性可以分为两个类:颜色和 DBCS。 标头文件中定义了 WinCon.h 以下属性。

特征 含义
FOREGROUND_BLUE 文本颜色包含蓝色。
FOREGROUND_GREEN 文本颜色包含绿色。
FOREGROUND_RED 文本颜色包含红色。
FOREGROUND_INTENSITY 文本颜色会加紧。
BACKGROUND_BLUE 背景色包含蓝色。
BACKGROUND_GREEN 背景色包含绿色。
BACKGROUND_RED 背景色包含红色。
BACKGROUND_INTENSITY 背景色会加剧。
COMMON_LVB_LEADING_BYTE 前导字节。
COMMON_LVB_TRAILING_BYTE 尾随字节。
COMMON_LVB_GRID_HORIZONTAL 顶部水平。
COMMON_LVB_GRID_LVERTICAL 左垂直。
COMMON_LVB_GRID_RVERTICAL 右垂直。
COMMON_LVB_REVERSE_VIDEO 反向前景和后台属性。
COMMON_LVB_UNDERSCORE 强调。

前台属性指定文本颜色。 背景属性指定用于填充单元格背景的颜色。 其他属性用于 DBCS

应用程序可以结合前台和背景常量来实现不同的颜色。 例如,以下组合在蓝色背景上产生明亮的青色文本。

FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE

如果未指定背景常量,则背景为黑色,如果未指定前台常量,则文本为黑色。 例如,以下组合在白色背景上生成黑色文本。 为合并为白色背景的背景指定红色、绿色和蓝色。 没有为前台指定标志颜色,因此为黑色。

BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED

每个屏幕缓冲区字符单元格存储用于绘制前景色(文本)和该单元格背景的颜色属性。 应用程序可以单独设置每个字符单元格的颜色数据,并将数据存储在每个单元格CHAR_INFO结构的 Attributes 成员中。 每个屏幕缓冲区的当前文本属性用于随后由高级函数写入或回显的字符。

应用程序可以使用 GetConsoleScreenBufferInfo 来确定屏幕缓冲区的当前文本属性和 SetConsoleTextAttribute 函数来设置字符属性。 更改屏幕缓冲区的属性不会影响以前写入的字符的显示。 这些文本属性不会影响由低级控制台 I/O 函数(如 WriteConsoleOutput 或 WriteConsoleOutputCharacter 函数)编写的字符,这些字符要么显式指定写入的每个单元格的属性,要么使属性保持不变。

注释

不建议使用低级别函数作默认和特定文本属性。 建议使用 虚拟终端序列 设置文本属性。 有关首选虚拟终端序列的详细信息,请参阅 经典函数与虚拟终端 文档。

字体属性

GetCurrentConsoleFont 函数检索有关当前控制台字体的信息。 存储在 CONSOLE_FONT_INFO 结构中的信息包括字体中每个字符的宽度和高度。

GetConsoleFontSize 函数检索指定控制台屏幕缓冲区使用的字体大小。

注释

不建议使用函数查找和作字体信息。 建议以中性字体方式作命令行应用程序,以确保跨平台兼容性以及与允许用户自定义字体的主机环境的兼容性。 有关用户首选项和主机环境(包括终端)的详细信息,请参阅 生态系统路线图