Студопедия

КАТЕГОРИИ:


Архитектура-(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. Здесь для этих целей служила функция с прототипом

APIRET16 VioSetCurPos(USHORT row, USHORT col, HVIO hvio).

Заметим, что все функции, осуществляющие управление экраном в этой ОС, имели префиксом названия буквосочетание Vio и возвращали 16-битное значение кода возврата, определяющее успешное выполнение функции как нулевое значение, ненулевые значения зарезервированы для кодов ошибок. Аргументами этой функции служили номера строки и столбца, в которые требовалось установить текстовый курсор. Последний аргумент hvio предполагалось использовать при множестве мониторов, подключенных к одному системному блоку компьютера. При единственном мониторе этот параметр должен быть равен 0. (Теоретически его задает хэндл монитора, для которого выполняется позиционирование.)

Обратной функцией к описанной являлась функция с прототипом

APIRET16 VioGetCurPos(USHORT *prow, USHORT *pcol, HVIO hvio).

Она возвращала значения номеров строки и столбца, в которых находится курсор.

Существенно отличается позиционирование курсора в ОС Windows. Здесь функция позиционирования имеет прототип

BOOL SetConsoleCursorPosition(HANDLE hConsOut, COORD pos).

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

typedef struct _COORD {

SHORT X;

SHORT Y;

} COORD, *PCOORD;

Ее использование требует от программиста несколько больших усилий. Так, например, установка курсора в третью строку и пятый столбец при работе в OS/2 требует единственной записи вызова функции в виде VioSetCurPos(3, 5, 0), а аналогичное указание позиции курсора для консоли ОС Windows вынуждает предварительно описать экземпляр структуры типа COORD, например в виде

COORD pos;

а затем задать запись целых трех операторов

pos.X=5; pos.Y=3;

SetConsoleCursorPosition(hout, &pos);

Обратная к установке функция, позволяющая определить текущую позицию курсора, описывается в Windows прототипом

BOOL GetConsoleScreenBufferInfo(HANDLE hConsOut,

CONSOLE_SCREEN_BUFFER_INFO* pConsoleScreenBufferInfo)

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

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {

COORD dwSize;

COORD dwCursorPosition;

WORD wAttributes;

SMALL_RECT srWindow;

COORD dwMaximumWindowSize;

} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;

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

В операционной системе Unix для управления курсором и некоторых других действий с экраном предназначены управляющие последователь­ности. Идея их использования расширяет управляющие символы, которые в языке Си и Unix служат основным средством управления выводом на экран. Управляющие последовательности определяются стандартом ANSI и называются также ANSI-последо­ва­тель­ностями. Их можно использовать и в других ОС, но там часто для этого оказывается необходимым запустить ANSI-драйвер. В MS DOS этот драйвер должен был быть установлен в конфигурационном файле CONFIG.SYS, в OS/2 – запущен как отдельная программа ANSI.EXE.

Управляющие последовательности ANSI начинаются со специального символа с десятичным эквивалентом значения 27. Это код, выдаваемый клавишей Esc, и при записи на языке Си в составе текстовых констант его записывают в виде '\033'. При этом задействована универсальная форма записи произвольных (в том числе явно не изображаемых символов) в виде восьмеричных констант. Вторым символом управляющих последовательностей ANSI является обязательный символ ‘[‘ (открывающаяся квадратная скобка), последним символом управляющей последовательности – латинская буква, детализирующая операцию. Иногда для такой детализации используется и предпоследний символ.

Для задания установки курсора служит управляющая последовательность, записываемая на языке Си как текстовая константа

"\033[ строка; столбец H"

Здесь компоненты строка и столбец должны быть обязательно заданы десятичными числами и обязательно без дополнительных пробелов. В дальнейшем записывать управляющие последовательности (как принято в документации) будем без подразумеваемых кавычек, а служебный символ \033 условно записывать как esc, подразумевая, что это все-таки не три латинских буквы подряд, а один специальный символ. Нумерация позиции считается от 1, так что установка в верхний левый угол экрана требует последовательности esc [1;1H.

Для чтения позиции курсора имеется также специальная управляющая последовательность, но использование ее не очень удобно, а главное в ней практически нет необходимости при наличии таких интересных и удобных управляющих последовательностей, какие просто переводят курсор на заданное число строк и столбцов в вертикальном и горизонтальном направлениях. Для этих целей предназначены управляющие последовательности esc [ строка A, esc [ строка B, esc [ столбец C, esc [ столбец D, последние символы в которых обязательно прописные латинские буквы.

Последовательность esc [ строка A приказывает переместить курсор на заданное в ней число строк вверх, последовательность esc [ строка B – на заданное число строк вниз, esc [ столбец C – на заданное в ней число столбцов вправо, а esc [ столбец D – на заданное число столбцов влево. Если при заданных значениях параметров курсор должен выйти за пределы экрана, то действие управляющей последовательности игнорируется.

 

<== предыдущая лекция | следующая лекция ==>
Структура операционной системы типа Windows NT | Многократный вывод символов и атрибутов
Поделиться с друзьями:


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


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



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




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