Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.76 Mб
Скачать

10.6.Буферы дисплея консоли

Дисплейный буфер представляет собой двумерный массив символов и их цветов, которые выводятся в окно консоли. Консоль может иметь много дисплейных буферов. Активный дисплейный буфер – тот, содержимое которого отображается на дисплее.

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

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

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

  • размер буфера в знакоместах, т.е. число символов в строке и число строк;

  • текстовые атрибуты (цвета символов и фона, которые используются функциями WriteFile() и WriteConsole() для вывода текста на консоль);

  • позиция и размеры окна (прямоугольная область дисплейного буфера, которая отображается в окне консоли);

  • позиция курсора, его форма и видимость;

  • режимы вывода (ENABLE_PROCESSED_OUTPUT и ENABLE_WRAP_AT_EOL_OUTPUT). Для получения дополнительной информации по этим режимам см. подраздел «Высокоуровневые режимы консоли».

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

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

10.7.Размер буфера окна и дисплея

Размер дисплейного буфера выражается в знакоместах. Ширина – это число символов в строке, а высота – число строк. С каждым дисплейным буфером связано окно консоли, в котором отображается содержимое прямоугольной области дисплейного буфера. Окно определяется путем указания координат левого верхнего угла и правого нижнего, в знакоместах.

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

Функция GetConsoleScreenBufferInfo() возвращает следующую информацию о дисплейном буфере и его окне:

  • текущий размер дисплейного буфера;

  • позиция курсора и цветовые атрибуты;

  • текущая позиция окна;

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

Функция GetLargestConsoleWindowSize() возвращает максимальный размер окна консоли, зависящий от текущего шрифта и размера дисплея. Этот размер отличается от размера, возвращаемого GetConsoleScreenBufferInfo(), тем, что размер дисплейного буфера игнорируется.

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

С помощью функции SetConsoleWindowInfo() можно изменить размер или положение окна консоли. Функция завершается с ошибкой при попытке установки размера окна большего, чем размер дисплейного буфера или дисплея компьютера. Изменение размера окна активного дисплейного буфера приводит к изменению размера окна консоли, отображаемого на дисплее.

Процесс может изменить режим ввода консоли таким образом, чтобы можно было получать ввод в то время, когда пользователь изменяет размер дисплейного буфера. Если некоторое приложение допускает ввод, оно может использовать функцию GetConsoleScreenBufferInfo() для получения размера окна и дисплейного буфера при старте приложения. Эта информация в дальнейшем может быть использована для выбора способа и вида представления данных в окне консоли. Если пользователь изменит размеры дисплейного буфера, приложение может изменить способ отображения данных в окне. Например, приложение может изменить способ вывода текста в окно (text wrap) при изменении числа символов в строке. Для получения дополнительной информации см. «Низкоуровневые режимы консоли» (Low-Level Console Modes).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]