Поделиться через


Буферы экрана консоли

Буфер экрана — это двухмерный массив символьных и цветовых данных для выходных данных в окне консоли. Консоль может иметь несколько буферов экрана. Активный буфер экрана — это тот, который отображается на экране.

Система создает буфер экрана при создании новой консоли. Чтобы открыть дескриптор активного буфера экрана консоли, укажите значение CONOUT$ в вызове функции CreateFile . Процесс может использовать функцию CreateConsoleScreenBuffer для создания дополнительных буферов экрана для консоли. Новый буфер экрана не активен, пока его дескриптор не указан в вызове функции SetConsoleActiveScreenBuffer . Однако доступ к буферам экрана можно получить для чтения и записи, активной или неактивной.

Каждый буфер экрана имеет собственный двухмерный массив записей сведений о символах. Данные для каждого символа хранятся в CHAR_INFO структуре , которая задает символ Юникода или ANSI, а также цвет переднего плана и фона, в котором отображается этот символ.

Ряд свойств, связанных с буфером экрана, можно задать независимо для каждого буфера экрана. Это означает, что изменение активного буфера экрана может иметь резкое влияние на внешний вид окна консоли. К свойствам, связанным с буфером экрана, относятся следующие:

  • Размер буфера экрана в строках символов и столбцах.
  • Текстовые атрибуты (цвет переднего плана и фона для отображения текста, написанного функцией WriteFile или WriteConsole ).
  • Размер окна и расположение (прямоугольная область буфера экрана консоли, отображаемая в окне консоли).
  • Положение курсора, внешний вид и видимость.
  • Режимы вывода (ENABLE_PROCESSED_OUTPUT и ENABLE_WRAP_AT_EOL_OUTPUT). Дополнительные сведения о режимах вывода консоли см. в разделеHigh-Level режимы консоли.

При создании буфера экрана он содержит пробелы в каждой позиции. Его курсор отображается и размещается в источнике буфера (0,0), а окно размещается в левом верхнем углу в источнике буфера. Размер буфера экрана консоли, размер окна, текстовые атрибуты и внешний вид курсора определяются пользователем или системными значениями по умолчанию. Чтобы получить текущие значения различных свойств, связанных с буфером экрана консоли, используйте функции GetConsoleScreenBufferInfo, GetConsoleCursorInfo и GetConsoleMode .

Приложения, изменяющие любой из свойств буфера экрана консоли, должны либо создать собственный буфер экрана, либо сохранить состояние унаследованного буфера экрана во время запуска и восстановить его при выходе. Это совместное поведение требуется, чтобы другие приложения, совместно использующие один и тот же сеанс консоли, не влияли на изменения.

Подсказка

Рекомендуется использовать альтернативный режим буфера , если это возможно, вместо создания второго буфера экрана для этой цели. Альтернативный режим буфера обеспечивает повышенную совместимость между удаленными устройствами и другими платформами. Дополнительные сведения см. в нашем обсуждении по классическим ИНТЕРФЕЙСАм API консоли и виртуальному терминалу .

Внешний вид и положение курсора

Курсор буфера экрана может быть видимым или скрытым. Когда она видна, ее внешний вид может отличаться, начиная от полного заполнения символьной ячейки до горизонтальной линии в нижней части ячейки. Чтобы получить сведения о внешнем виде и видимости курсора, используйте функцию GetConsoleCursorInfo . Эта функция сообщает, является ли курсор видимым и описывает внешний вид курсора в процентах от заполняемой ячейки символов. Чтобы задать внешний вид и видимость курсора, используйте функцию SetConsoleCursorInfo .

Символы, написанные функциями ввода-вывода консоли высокого уровня , записываются в текущее расположение курсора, перемещая курсор в следующее расположение. Чтобы определить текущую позицию курсора в системе координат буфера экрана, используйте GetConsoleScreenBufferInfo. С помощью SetConsoleCursorPosition можно задать позицию курсора и, таким образом, контролировать размещение текста, написанного или эхоированного функциями ввода-вывода высокого уровня. При перемещении курсора текст в новом расположении курсора перезаписывается.

Замечание

Использование низкоуровневых функций для поиска позиции курсора не рекомендуется. Рекомендуется использовать последовательности виртуальных терминалов для запроса этой позиции при необходимости для расширенных макетов. Дополнительные сведения о предпочтительных последовательностях виртуальных терминалов можно найти в классических функциях и в документе виртуального терминала .

Положение, внешний вид и видимость курсора задаются независимо для каждого буфера экрана.

Атрибуты символов

Атрибуты символов можно разделить на два класса: цвет и 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 для каждой ячейки. Текущие текстовые атрибуты каждого буфера экрана используются для символов, которые впоследствии записываются или отражаются функциями высокого уровня.

Приложение может использовать GetConsoleScreenBufferInfo для определения текущих текстовых атрибутов буфера экрана и функции SetConsoleTextAttribute для задания атрибутов символов. Изменение атрибутов буфера экрана не влияет на отображение символов, записанных ранее. Эти текстовые атрибуты не влияют на символы, написанные функциями ввода-вывода консоли низкого уровня (например, функцией WriteConsoleOutput или WriteConsoleOutputCharacter), которая явно указывает атрибуты для каждой ячейки, написанной или не изменяя атрибуты.

Замечание

Использование низкоуровневых функций для управления значениями по умолчанию и определенным текстовым атрибутам не рекомендуется. Рекомендуется использовать последовательности виртуальных терминалов для задания текстовых атрибутов . Дополнительные сведения о предпочтительных последовательностях виртуальных терминалов можно найти в классических функциях и в документе виртуального терминала .

Атрибуты шрифта

Функция GetCurrentConsoleFont извлекает сведения о текущем шрифте консоли. Сведения, хранящиеся в структуре CONSOLE_FONT_INFO , включают ширину и высоту каждого символа в шрифте.

Функция GetConsoleFontSize извлекает размер шрифта, используемого указанным буфером экрана консоли.

Замечание

Использование функций для поиска и управления сведениями о шрифте не рекомендуется. Рекомендуется работать с приложениями командной строки с нейтральным шрифтом, чтобы обеспечить кроссплатформенную совместимость, а также совместимость с средами узлов, которые позволяют пользователю настраивать шрифт. Дополнительные сведения о предпочтениях пользователей и средах размещения, включая терминалы, см. в схеме развития экосистемы.