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

10.8.Скроллинг дисплейного буфера

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

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

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

  • когда вызывается функция WriteFile() для записи в дисплейный буфер с включенным режимом «переноса текста» (text wrap) в конце строки (EOL – end-of-line), прямоугольник окна автоматически перемещается, так что курсор отображается постоянно;

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

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

Рис. 2. Положение прямоугольника окна относительно дисплейного буфера консоли

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

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

  • когда вызывается функция WriteFile() для записи в дисплейный буфер с включенным режимом «переноса текста» (text wrap) в конце строки (EOL – end-of-line), содержимое дисплейного буфера автоматически скроллируется при достижении конца буфера. Этот скроллинг уничтожает верхнюю строку буфера.

Функция ScrollConsoleScreenBuffer() перемещает указанный прямоугольник дисплейного буфера в новое указанное место. В результате ее выполнения может быть выполнен скроллинг части дисплейного буфера или всего содержимого буфера.

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

Рис. 3. Результат действия функции ScrollConsoleScreenBuffer()

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

Позиция и вид курсора.

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

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

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

Цветовые атрибуты дисплейного буфера.

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

Приложение может использовать функцию GetConsoleScreenBufferInfo() для получения текущих цветовых атрибутов буфера и функцию SetConsoleTextAttribute() для их установки. Как и для обычного текстового режима изменение атрибутов текста не влияет на прежде выведенный текст. Эти текстовые атрибуты не применяются к символам, выводимых с помощью низко уровневых функций, таких как 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

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