Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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




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

 



Методы ввода/вывода в консольных приложениях

Функции Win32 API предлагают два довольно разных подхода к вводу/выводу в консольных приложениях, выбор которых определяется тем, насколько большая гибкость требуется приложению. Высокоуровневый подход позволяет просто реализовать поток ввода/вывода, однако ограничивает доступ к буферам ввода/вывода консоли. Низкоуровневый подход требует от разработчиков написания более объемного кода и использования большой номенклатуры функций, однако же предоставляет приложению значительно большую гибкость.

Любое приложение может использовать файловые функции ReadFile() и WriteFile() и консольные ReadConsole() и WriteConsole() для высокоуровневого ввода/вывода, который обеспечивает непрямой доступ к буферам ввода/вывода консоли. Высокоуровневые функции ввода фильтруют и обрабатывают данные во входном буфере консоли и возвращают поток символов, не учитывая события от мыши и изменения размеров дисплейного буфера. Аналогично, высокоуровневые функции вывода пишут поток символов, которые отображаются в текущей позиции курсора в дисплейном буфере. Приложение управляет работой этих функций путем установки режимов ввода/вывода консоли.

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

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

В последующих подразделах описываются детали использования упомянутых методов.

 

Режимы консоли

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

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










Последнее изменение этой страницы: 2018-04-12; просмотров: 338.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...