控制台屏幕缓冲区

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

系统在创建新控制台时就会创建一个屏幕缓冲区。 若要打开控制台活动屏幕缓冲区的句柄,请在对 CreateFile 函数的调用中指定 CONOUT$ 值。 进程可以使用 CreateConsoleScreenBuffer 函数为其控制台创建额外的屏幕缓冲区。 新屏幕缓冲区处于非活动状态,直到在对 SetConsoleActiveScreenBuffer 函数的调用中指定了其句柄。 但是,无论屏幕缓冲区处于活动状态还是非活动状态,都可供访问以进行读写操作。

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

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

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

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

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

提示

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

光标外观和位置

屏幕缓冲区的光标可以可见,也可以隐藏。 当光标可见时,其外观可以变化,范围从占满字符单元格到显示为单元格底部的水平线。 若要检索有关光标外观和可见性的信息,请使用 GetConsoleCursorInfo 函数。 此函数报告光标是否可见,并将光标的外观描述为其占字符单元格的百分比。 若要设置光标的外观和可见性,请使用 SetConsoleCursorInfo 函数

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

注意

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

光标的位置、外观和可见性是针对每个屏幕缓冲区单独设置的。

字符属性

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

Attribute 含义
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 结构的属性中。 每个屏幕缓冲区的当前文本属性用于随后由高级函数写入或回显的字符。

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

注意

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

字体属性

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

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

注意

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