控制台窗口显示活动屏幕缓冲区的一部分。每个屏幕缓冲区保持其自己的当前窗口矩形,其指定要在控制台窗口中显示的左上角和右下角的单元格的坐标。要确定屏幕缓冲区的当前窗口矩形,请使用GetConsoleScreenBufferInfo.当创建屏幕缓冲区时,其窗口的左上角位于屏幕缓冲区的左上角(0,0)处。
窗口矩形可以改变以显示屏幕缓冲区的不同部分。屏幕缓冲区的窗口矩形在以下情况下可以更改:
*当调用SetConsoleWindowInfo指定新的窗口矩形时,通过更改窗口矩形的位置来滚动屏幕缓冲区的视图,而不改变窗口的大小。有关滚动窗口内容的示例,请参阅滚动屏幕缓冲区的窗口.
*当使用WriteFile功能写入屏幕缓冲区时,使用行尾(EOL)输出模式进行换行,窗口矩形将自动移动,因此始终显示光标。
*当SetConsoleCursorPosition功能指定了当前窗口矩形边界外的新光标位置时,窗口矩形将自动移动以显示光标。
*当用户更改控制台窗口的大小或使用窗口的滚动条时,活动屏幕缓冲区的窗口矩形可以更改。此更改不会在输入缓冲区中报告为窗口大小调整事件。
在这些情况的每一个中,窗口矩形移动以显示屏幕缓冲器的不同部分,但是屏幕缓冲器的内容保持在相同的位置。以下情况可能导致屏幕缓冲区的内容移动:
*当调用ScrollConsoleScreenBuffer函数时,将一个矩形块从屏幕缓冲区的一部分复制到另一个。
*使用WriteFile在启用EOL输出模式的情况下写入屏幕缓冲区时,屏幕缓冲区的内容会在遇到屏幕缓冲区结束时自动滚动。此滚动将放弃屏幕缓冲区的顶行。
ScrollConsoleScreenBuffer指定移动的屏幕缓冲区矩形和复制矩形的新的左上坐标。此函数可以滚动屏幕缓冲区的一部分或全部内容。
该图显示了一个ScrollConsoleScreenBuffer操作,将屏幕缓冲区的全部内容向上滚动多行。顶部行的内容将被丢弃,底部行将以指定的字符和颜色填充。
可以通过指定可选的剪切矩形来限制ScrollConsoleScreenBuffer的效果,使得剪切矩形外的屏幕缓冲区的内容不变。剪切的效果是创建一个子窗口(剪切矩形),其内容被滚动而不影响屏幕缓冲区的其余部分。有关使用ScrollConsoleScreenBuffer的示例,请参阅滚动屏幕缓冲区的内容.
光标的外观和位置
屏幕缓冲区的光标可以被看见或隐藏。当它可见时,其外观可以变化,从完全填充字符单元格到在单元格底部显示为水平线。要检索有关游标的外观和可见性的信息,请使用GetConsoleCursorInfo功能。此函数报告光标是否可见,并将光标的外观描述为填充的字符单元格的百分比。要设置光标的外观和可见性,请使用SetConsoleCursorInfo功能。
由高级控制台I / O功能写入的字符将写入当前的光标位置,将光标移动到下一个位置。要确定屏幕缓冲区坐标系中当前的光标位置,请使用GetConsoleScreenBufferInfo.您可以使用SetConsoleCursorPosition设置光标位置,从而控制由高级I / O功能写入或回送的文本的位置。如果移动光标,则新光标位置处的文本将被覆盖。
每个屏幕缓冲区都独立设置光标的位置,外观和可视性。
屏幕缓冲区颜色属性
每个屏幕缓冲区字符单元格存储用于绘制该单元格的文本和背景的颜色的颜色属性。应用程序可以单独设置每个字符单元的颜色数据,将数据存储在每个单元格的CHAR_INFO结构的CHAR_INFO成员中。
每个屏幕缓冲区的当前文本属性确定由高级功能随后写入或回显的字符的前景(文本)和背景颜色。应用程序可以使用GetConsoleScreenBufferInfo确定屏幕缓冲区的当前文本属性和设置文本属性的SetConsoleTextAttribute函数。更改屏幕缓冲区的文本属性不会影响以前写入的字符的显示。这些文本属性不会影响由低级别控制台I / O功能(如WriteConsoleOutput或WriteConsoleOutputCharacter函数)编写的字符),它们明确指定每个写入的单元格的属性,或者在书面职位
以下属性常量在WINCON.H头文件中定义:
*FOREGROUND_BLUE
*FOREGROUND_GREEN
*FOREGROUND_RED
*FOREGROUND_INTENSITY
*BACKGROUND_BLUE
*BACKGROUND_GREEN
*BACKGROUND_RED
*BACKGROUND_INTENSITY
前景属性指定文本颜色,背景属性指定填充单元格背景的颜色。应用程序可以组合常量来实现不同的颜色。例如,以下组合将导致蓝色背景上的明亮的青色文字。
FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE
如果没有指定背景常数,则背景颜色为黑色,如果未指定前景常量,则文字为黑色。例如,以下组合在白色背景上生成黑色文本。
BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED