Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Вывод в произвольную позицию экрана




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

APIRET16 VioWrtCharStr(PCH text, USHORT len, USHORT row,

USHORT col, HVIO hvio).

В этой функции параметр text задавал адрес строки выводимого текста, параметр len – длину этого текста в байтах, параметры row и col давали номера строки и столбца позиции экрана, начиная с которой производится вывод. Если при выполнении функции достигался конец экрана, то вывод прекращался. Число действительно выведенных символов выдавалось как возвращаемое значение функции.

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

 

В операционной системе Windows для вывода строки текста в произвольную позицию экрана служит функция

BOOL WriteConsoleOutputCharacter(HANDLE hConsOut,

CSTR* text, DWORD len, COORD pos, DWORD* actlen).

Параметры, используемые в функции WriteConsoleOutputCharacter, имеют те же назначения, что и одноименные - описанные ранее в предыдущих функциях. Парное сочетание функций FillConsoleOutputAttribute и WriteConsole­Output­Character характерно для консольных приложений Windows, в которых требуется выполнять вывод с новым цветом в непоследовательных позициях экрана.

Заметим, что в Windows нет системной функции, объединяющей указанные действия функций FillConsoleOutputAttribute и WriteConsoleOutputCharacter. В операционной же системе OS/2 такая функция была запасена и называлась VioWrtCharStrAtt. Прототип функции описывался на языке Си как

APIRET16 VioWrtCharStrAtt(PCH text, USHORT len, USHORT row,

USHORT col, PBYTE attr, HVIO hvio).

Первый аргумент text задавал выводимый текст и указывался в вызове своим адресом; второй аргумент len должен был задаваться коротким словом и определял длину выводимого текста. Следующие два аргумента определяли позицию начала текста на экране. Третий аргумент row определял номер строки на экране, а четвертый col – номер колонки для позиции, откуда начинал выводиться текст. Пятый аргумент attr определял байт атрибутов для текста и должен был задаваться адресом в памяти, где этот атрибут записан.

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

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

char celltext[ ]={'П', 0xc1, 'р', 0x2, 'и', 0xb, 'в', 0x1e, 'е', 0x2c, 'т', 0xe9};

В операционной системе Windows рассмотренной функции вывода символов вместе с их атрибутами соответствует функция

BOOL WriteConsoleOutput(HANDLE hConsOut, CHAR_INFO* cells,

COORD dwBufferSize, COORD dwBufferCoord, SMALL_RECT* rect).

Возможности этой функции значительно шире, чем будет нами рассмотрено, и позволяют вернуть на экран, не обязательно в то же его место, запомненный ранее в памяти фрагмент текстового изображения экрана с полным учетом цветовых атрибутов. Функция эта в качестве исходной отображаемой информации использует двухмерный массив (а не одномерный как в OS/2) ячеек, хранящих всю отображаемую информацию о символах на экране. Этот массив задается для функции адресом в параметре cells. Его элементы должны быть описаны как имеющие тип CHAR_INFO, который в заголовочном файле задается описанием

typedef struct _CHAR_INFO {

union {

WCHAR UnicodeChar;

CHAR AsciiChar;

} Char;

WORD Attributes;

} CHAR_INFO, *PCHAR_INFO;

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

typedef struct _SMALL_RECT {

SHORT Left;

SHORT Top;

SHORT Right;

SHORT Bottom;

} SMALL_RECT, *PSMALL_RECT;

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

В операционных системах Windows имеется функция для вывода на экран, не имеющая аналога в OS/2. Это функция WriteConsoleOutputAttribute, предназначенная для вывода последовательности различных атрибутов на экран. Целесообразность выделения подобных действий в отдельную функцию представляется весьма сомнительной, но может быть кто-то из читателей найдет ей удачное применение в своих разработках. (Практически возможности этой функции перекрываются в OS/2 выше рассмотренной функцией VioWrtCellStr.) Прототип функции WriteConsoleOutputAttribute дается описанием

BOOL WriteConsoleOutputAttribute(HANDLE hConsOut,

WORD* attrs, DWORD len, COORD pos, DWORD* actlen).

Параметр attrs задает массив атрибутов, элементами которого являются слова (а не байты как в OS/2 и MS DOS), содержащие атрибуты. Параметр len определяет размер используемого массива (точнее используемой части массива); pos - задает позицию экрана, начиная с которой выполняется заполнение атрибутами, параметр actlen используется для возвращения числа действительно записанных атрибутов.

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

"\033[1;31;44mП\033[0;32;40mр\033[1;36;40mи\033[33;44mв

\033[31;42mе\033[34;43mт\n"

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

В частности, для очистки экрана Unix содержит специальную управляющую последовательность, которая определяется как

esc[2J

После очистки экрана, вызванного этой управляющей последовательностью, курсор помещается в левый верхний угол. Кроме очистки экрана имеется еще одна часто удобная последовательность – очистить строку, задаваемую как esc[K. Это управление удаляет все символы, начиная с позиции курсора до конца строки, включая символ в позиции курсора.

 




Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 661; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.