Управление дисплеем и клавиатурой с использованием Escape - последовательностей

5.11.1. Управление дисплеем и клавиатурой с использованием Escape-последовательностей

 

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

Для использования управляющих последовательностей (в данном случае — Escape-последо­вательностей) требуется осуществить подключение к DOS драйвера ANSI.SYS (см. описание команды DEVICE = в п. 5.10.2 и драйвера ANSI.SYS в п. 5.10.3).

Escape - последовательность представляет собой последовательность символов, первым из ко­торых является литера ESC, имеющая код 27 (1ВН) и графическое изображение Для воздействия на консоль Escape-последовательность нужно послать на дисплей. Она будет перехвачена драй­вером ANSI.SYS, который и выполнит требуемые действия.

Структура Escape-последовательности такова. Сначала следует пара символов ← [. Затем располагаются операнды — числа, разделенные точкой с запятой. А завершается последователь­ность однобуквенной командой.

В Escape-последовательностях одноименные строчные и прописные буквы не рассматриваются как эквивалентные. Все числовые величины (которые должны задаваться в символьном виде) пред­ставляются в последовательностях с использованием десятичной системы счисления. Строки и столбцы экрана нумеруются, начиная с 1. Символ [ принадлежит последовательности, а не является метасимволом.

Допустимы следующие Escape-последовательности:

1) для управления курсором:

←[l;сН        — позиционирует (устанавливает) курсор в с-ю позицию l - й строки. По умолчанию (←[Н) курсор устанавливается в верхний левый угол экрана;

←[l;cf             — то же;

←[nА          — перемещает курсор вверх на п строк без изменения позиции внутри строки. По умолчанию (←[А) принимается 1. Если курсор уже находится в верхней строке, то последовательность игнорируется;

←[пВ         — перемещает курсор вниз на п строк без изменения позиции внутри строки. По умолчанию (←[В) принимается 1. Если курсор уже находится в нижней строке, то последовательность игнорируется;

←[пС         — перемещает курсор по строке вправо на п позиций. По умолчанию (←[С) принимается 1. Если курсор уже находится в крайней правой позиции строки, то последовательность игнорируется;

←[nD       — перемещает курсор по строке влево на п позиций. По умолчанию (←[D) принимается 1. Если курсор уже находится в крайней левой позиции, то последова­тельность игнорируется;

←[s           — запоминает текущую позицию курсора (номера строки и позиции в строке, т.е. колонки) для обеспечения возможности последующей его установки в эту позицию. Более одной позиции запомнить нельзя;

 ←[и             — восстанавливает позицию курсора (устанавливает курсор в позицию, запомненную последней из последовательностей ←[s);

←[6n            — выводит на экран текущую позицию курсора в форме ←[l;sR, где l — номер строки, a s — номер столбца;

2) для удаления символов с экрана дисплея:

←[2J            — очищает экран и устанавливает курсор в его левый верхний угол;

←[К             — удаляет все символы от курсора до конца строки (включая позицию курсора);

3) для установки режима работы дисплейного адаптера и выбора цветов:

←[s;...sm  — устанавливает атрибуты дисплея в текстовом режиме, которые действуют до тех пор, пока не будут изменены такой же последовательностью. Однако атрибуты уже выведенной информации не изменяются, вследствие чего целесообразно пред­варительно очищать экран. В качестве атрибутов s в любом порядке можно задать режим отображения символов, цвет символов и цвет фона. Если какой-либо из атрибутов не указан, то продолжает действовать установленный.

Допустимы следующие режимы отображения символов:

0 — сбросить все атрибуты, установив исходные (белые символы на черном фоне);

1 — повысить интенсивность выводимых символов, что в   совокупности с допустимыми восемью цветами позволяет получить 16 цветов;

4 — выводить символы с подчеркиванием (только для монохромного дисплея);

5 — обеспечить мерцание выводимых символов;

7 — включить режим реверсивного отображения (символы выводить фоновым цветом, а фон — цветом символов);

8 — отключить вывод (задать черный цвет для фона и символов).

Можно установить следующие цвета символов (текста):

30 — черный (Black);

34 — синий (Blue);

32 — зеленый (Green);

36 — бирюзовый (Cyan);

31 — красный (Red);

35 — пурпурный (Magenta);

33 — коричневый, или охристый (Yellow);

37 — серебристый (White).

В качестве цвета фона можно задать такие же цвета:

40 — черный (Black);

44 — синий (Blue);

42 — зеленый (Green);

46 — бирюзовый (Cyan);

41 — красный (Red);

45 — пурпурный (Magenta);

43 — коричневый, или охристый (Yellow);

47 — серебристый (White).

←[=sh        — устанавливает заданный числом s режим (текстовый или графический) работы дисплейного адаптера. Допустимы следующие режимы:

 

0

40x25 символов, монохромный;

1

40x25 символов, цветной;

2

80x25 символов, монохромный;

3

80x25 символов, цветной;

4

320x200 точек, цветной;

5

320x200 точек, монохромный;

6

640x200 точек, черно-белый (двухцветный);

7

режим переноса конца длинной строки на следующую строку (иначе — отсечение);

14

640x200 точек, цветной;

15

640x350 точек, монохромный;

16

640x350 точек, цветной;

17

640x480 точек, цветной;

18

640x480 точек, цветной;

19

320x200 точек, цветной.

 

Режимы 0 — 3 и 7 являются текстовыми, а остальные — графическими. Возмож­ность установки того или иного режима зависит от типов дисплейного адаптера и дисплея. Режимы 14 — 19 доступны в DOS, начиная с версии 4.0 (для EGA и VGA). Умолчание для данной последовательности отсутствует;

←[=s1                           — то же, но   ←[= 71 отменяет перенос длинных строк;

4) для переопределения клавиш клавиатуры и их комбинаций:

←[k;...kp                 — переопределяет единственную клавишу или комбинацию клавиш таким образом, что при ее нажатии в буфер клавиатуры будет помещаться отличный от стандар­тного код (последовательность кодов). Это позволяет определять пользовательские макрокоманды, но в отличие от командных файлов — только без параметров. Здесь k — десятичное число или последовательность символов, заключенная в кавычки. Переопределяемая клавиша (комбинация клавиш) представляется одним или двумя первыми k. Если клавиша (комбинация клавиш) стандартно генерирует один из кодов ASCII, то ее можно задать либо соответствующим кодом (в деся­тичной системе счисления), либо соответствующим символом, заключенным в кавычки. Так, символ А можно представить как 65 (см. подраздел 5.3) или как "А". В случае, когда начальный операнд k является строкой более чем из одного символа, заключенной в кавычки, то первый из них обозначает переопределяемую клавишу. Если клавиша (комбинация клавиш) стандартно генерирует расширенный код клавиши, то ее можно представить только двумя числами, разделенными точкой с запятой (см. табл. 5.14 в п. 5.4.2). Остальные к и, возможно, остаток первого к, задают последовательность символов, которая будет генерироваться при нажатии указанной клавиши (комбинации клавиш). В частном случае эту последо­вательность символов можно представить единственной строкой. Однако если тре­буется задать управляющие символы или расширение ASCII, то придется использовать соответствующие коды. Кроме того, можно специфицировать и расширенные коды клавиш. Для восстановления прежнего смысла нажатия клавиши (комбинации кла­виш) следует продублировать ее код, в частности расширенный код клавиши.

Конечно, на устройство CON можно выдать несколько Escape-последовательностей подряд, но каждая из них должна начинаться с символов ←[.

Примеры Escape-последовательностей:

       ←[10;30Н — переместить курсор в 30-ю позицию 10-й строки экрана;

       ←[ЗВ — сместить курсор вниз на три строки;

       ←[1;34;41т — обеспечить вывод последующего текста голубым цветом на красном фоне;

       ←[=4h — переключить дисплейный адаптер в цветной графический режим с разрешением  320x200 точек;

       ←["\";"?"p — переопределить клавишу \ на ?;

       ←[92;63р — то же (92 — код символа \, а 63 — код символа ?);

       ←["\?"р — то же;

       ←["\";"?"p←[";";"\"p — поменять местами клавиши \ и ?;

      ←[4;"DIR С:";13р — переопределить комбинацию клавиш Ctrl-D так, чтобы при ее нажатии вводилась строка DIR С: Enter► (13 — код символа CR);

     ←[0;68;"DIR";13p — переопределить клавишу F10 так, чтобы при ее нажатии выдавалась команда DIR (вводилась строка DIREnter►);

     ←[0;68;0;68р — восстановить стандартную интерпретацию клавиши F10.

Для вывода Escape-последовательности на дисплей можно воспользоваться одним из следующих способов:

1) создать программным способом или текстовым редактором текстовый файл с Escape-по­следовательностью и вывести его содержимое на экран командой TYPE;

2) создать текстовым редактором командный файл с командой ECHO, в качестве аргумента которой указана Escape-последовательность, и выполнить его. Пример такого командного файла:

@ЕСНО OFF

ECHO ←[0;68;"DIR";13p

3) использовать команду PROMPT с двухсимвольной комбинацией $Е (см. п. 5.6.5), например:

PROMPT $E [0;68;"DIR";13p ,

вслед за которой нужно ввести команду для восстановления приглашения DOS прежнего вида. Тогда первой командой будет единственный раз выдано приглашение, содержащее Escape-по­следовательность, а второй — «нормальное» приглашение. Команды PROMPT такого вида удобнее специфицировать в командном файле и затем его при необходимости выполнять.

Кроме того, Escape-последовательность можно вывести на экран непосредственно из про­граммы. В качестве примера приведем программу на языке Turbo Pascal версий 5.0 — 6.0, иллюстрирующую применение Escape-последовательностей: Program ShowANSI; Begin

Write (#27'[5;31;44m');                                                       {установка следующих атрибутов дисплея:

                                                                                                                                 мерцающие символы;

                                                                                                                        цвет символов — красный;

                                                                                                                                   цвет фона — синий.}

Write (#27'[2J');

                                                                                                                                         {очистка экрана}

Write (#27'[13;15H');

                                                                                     {позиционирование курсора для вывода текста}

Write ('Вы видите красные мерцающие символы на синем фоне');

ReadLn;                                                                                                {пауза до нажатия клавиши Enter}

Write (#27'[0m');                                                                      {установка исходных атрибутов дисплея}

Write (#27'[2J')                                                                                                                  {очистка экрана}

End.

Эта программа обеспечивает вывод текста «Вы видите красные мерцающие символы на синем фоне» действительно красными мерцающими символами в середине синего экрана.

Тем не менее выдача Escape-последовательностей из программ на языках высокого уровня не является целесообразной, так как такие языки предоставляют в распоряжение пользователя гораздо более совершенные средства управления видеосистемой. В программах же на языках уровня Ассемблера применение Escape-последовательностей оправдано.

Символ ESC невозможно передать системе с клавиатуры (в частности, в команде ECHO), так как он перехватывается DOS и интерпретируется как немедленная отмена командной строки. Аналогично многие текстовые редакторы реагируют на нажатие клавиши Esc специальным образом, и поэтому их использовать для подготовки Escape-последовательностей не представляется возмож­ным. Однако иногда (например, в текстовом редакторе ЛЕКСИКОН) все же можно задать символ ESC путем набора кода 27 на малой цифровой клавиатуре на фоне нажатой клавиши Alt Редактор же EDLIN позволяет вводить практически любые управляющие символы, в частности ESC

Составление программы для формирования текстового файла с Escape-последовательностями трудоемко.

По указанным причинам для пользователя наилучшим является третий способ формирования и вывода Escape-последовательностей (в этом случае символ ESC задается косвенно — через $Е).