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


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

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

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

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

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

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

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

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

Совет

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

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

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

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

Примечание.

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

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

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

Атрибуты символов можно разделить на два класса: Color и 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

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

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

Примечание.

Мы не рекомендуем использовать низкоуровневые функции для изменения атрибутов текста (в том числе атрибутов по умолчанию). Чтобы задать атрибуты текста, используйте последовательности виртуального терминала. Дополнительные сведения о предпочтительных последовательностях виртуального терминала см. в документе о классических функциях и виртуальном терминале.

Атрибуты шрифтов

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

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

Примечание.

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