Страница 17 из 47
4.2.6 Создание альтернативных типов курсора. Все прерывания операционной системы, связанные с выводом на экран, используют курсор. Вы можете изменить форму курсора с помощью техники показанной в [4.2.4] или сделать курсор невидимым [4.2.3]. Возможны альтернативные типы курсора, когда вывод на экран осуществляется с помощью метода прямого отображения в па- мять [4.3.1]. При этом "истинный" курсор выключается, поскольку он не будет адресовать символы в определенную позицию видеобуфе- ра. Вместо этого создается "фальшивый" курсор с помощью байта атрибутов. Наиболее эффективным методом является установка атрибута выво- да в негативе для символа, на который указывает курсор. Для чер- но-белого экрана для этого атрибута следует использовать код ASCII 112. Другой способ - заставить символ, на который указывает курсор мигать. В этом случае надо просто добавить 128 к текущему значению атрибута, чтобы символ начал мигать, и вычесть 128, чтобы прекратить мигание. Третий способ - установить для символа режим подчеркивания (используя код ASCII 1). И, наконец, в прог- раммах использующих командную строку можно рассмотреть возмож- ность использования специального графического символа, который следует за последним символом командной строки, такого как стрел- ки выводимые кодами ASCII 17 или 27. Отметим, что когда программа получает ввод в нескольких режимах, то Вы можете помочь идентифи- цировать текущий режим за счет особого типа курсора.
Высокий уровень. В данном примере курсор формируется за счет вывода символа в позиции курсора в негативе. Переменная CURSORPOSITION хранит смещение символа, на который указывает курсор в видеобуфере. Это четное число в интервале от 0 до 3998. Прибавление к этой пере- менной 1 дает позицию байта атрибутов для этого символа и помес- тив туда 112 мы обеспечим вывод этого символа в негативе. Пере- менная FORMERATTRIBUTE хранит обычные атрибуты символа, с тем чтобы можно было восстановить их после того как курсор сдвинется.
500 '''процедура анализа поступающих расширенных кодов . 560 IF EXTENDEDCODE = 77 THEN GOSUB 5000 'курсор вправо
5000 '''процедура сдвигающая курсор вправо на одну позицию 5010 POKE CURSORPOSITION+1,FORMERATTRIBUTE 'восст. атрибут 5020 CURSORPOSITION = CURSORPOSITION+2 'новая позиция 5030 FORMERATTRIBUTE = PEEK(CURSORPOSITION+1) 'сохр. атрибут 5040 POKE CURSORPOSITION+1,112 'включаем негатив 5050 RETURN 'все сделано
Низкий уровень. Здесь тот же самый пример реализован на ассемблере:
;---процедура перемещения курсора на одну позицию вправо CURSOR_RIGHT: MOV BX,CURSORPOSITION ;получение позиции INC BX ;указываем на атрибут символа MOV AL,FORMERATTRIBUTE ;берем сохраненный атрибут MOV ES:[BX],AL ;восстанавливаем его INC BX ;указываем на следующий символ MOV CURSORPOSITION,BX ;сохраняем его смещение MOV AL,ES:[BX]+1 ;получаем атрибут нового символа MOV FORMERATTRIBUTE,AL ;сохраняем его MOV AL,112 ;помещаем атрибут вывода в негативе MOV ES:[BX]+1,AL ;засылаем его для следующего символа
|