Текстовый курсор в графическом режиме
При вводе и редактировании текста, для указания позиции вводимого или изменяемого символа, традиционно используется курсор. В графических режимах аппаратная поддержка текстового курсора выключена, поэтому применяется "программный" курсор. В данном разделе мы рассмотрим способ построения мигающего текстового курсора, а его использование при вводе символов с клавиатуры будет описано в следующем разделе.
Предварительные замечания
При работе в графических режимах на экране могут находиться рисунки двух курсоров, один из которых указывает текущее положение манипулятора "мышь", а второй – место вводимого или изменяемого символа. Главную роль играет "указатель мыши", он нужен для 'правления процессом выполнения задачи и, в частности, для изменения позиции текстового курсора. Указатель мыши может перемещаться по всей рабочей области экрана. В отличие от него текстовый курсор появляется только в определенных местах, например в диалоговых окнах.
Для работы с текстом в графических режимах на экране выделяются специальные строки или окна, размеры которых зависят от их назначения. Как правило, они не велики и предназначены для ввода различных установочных данных – числовых величин, зарезервированных (ключевых) слов, спецификаций файлов и т. п. Только у специализированных редакторов текстовые окна занимают большую часть экрана или весь экран.
Windows и ее приложения работают с текстом в черно-белом режиме – на елом фоне изображаются черные буквы. Текстовый курсор обычно имеет форму мигающей вертикальной черты, цвет которой совпадает с цветом укв. Высота черты зависит от высоты шрифта, а ширина составляет одну ли две точки. Рассмотрим, как программируется подобный рисунок тек-тового курсора (далее по тексту просто "курсора").
Способ построения курсора
В процессе редактирования текста изображение курсора может перемещаться по строкам и располагаться на месте уже выеденных символов. Поэтому надо принять специальные меры, для того тобы при перемещении курсор не искажал изображение символов текста, например сохранять рисунок расположенного под курсором символа и восстанавливать его после перемещения курсора. При работе с текстом обычно используют более простой способ, при котором для записи кодов точек рисунка курсора в видеопамять используется команда хоr.
Двухадресная команда хоr вычисляет логическую функцию exclusive OR исключающее ИЛИ), ее операндами являются источник и приемник, результат помещается в приемник. При выполнении инструкции хоr микропроцессор запрещает перенос единиц переполнения из младших разрядов старшие и производит поразрядное сложение операндов. Результат выполнения операции для одного бита показан в табл. 5.1.
Таблица 5.1. Схема выполнения операции хоr.
Состояние бита источника | 0 | 0 | 1 | 1 |
Состояние бита приемника | 0 | 1 | 0 | 1 |
Состояние бита результата | 0 | 1 | 1 | 0 |
Обратите внимание на последний столбец таблицы. Если состояние всех разрядов у приемника и источника одинаково, то в результате получится нуль, т. е. приемник будет очищен. Это свойство команды хоr мы неоднократно использовали в примерах для очистки регистров. Здесь нас интересует ее другое свойство.
Если у источника установлены все разряды, то установленные разряды приемника будут очищены, а очищенные – установлены, т. е. код приемника будет инвертирован. При повторной инверсии произойдет восстановление исходного кода приемника. Таким образом, хоr позволяет инвертировать код приемника, а затем вернуть его первоначальное значение.
Использовать это свойство для построения текстового курсора можно только при определенных ограничениях. Напомним, что в режимах PPG код точки является номером регистра цвета видеокарты. Поэтому, инвертируя код точки, мы изменяем номер регистра видеокарты, а получаемый при этом цвет зависит от того, что записано в этом регистре, т. е. от установленной палитры цветов. При описании системной палитры, мы рекомендовали размещать код черного цвета в регистре 0, а белого – в регистре OFFh. В таком случае при инверсии кода точки будет инвертирован и ее цвет.
Точки изображения символа имеют черный цвет, если рисунок курсора затрагивает эти точки, то они станут белыми. Для уменьшения наложения рисунку курсора придают форму узкой вертикальной черты, расположенной в начале или в конце знакоместа. Например, у редактора Microsoft Word ширина курсора составляет 2 точки. Первая из них расположена в конце одного знакоместа, а вторая – в начале следующего, в которое будет помещен введенный с клавиатуры символ. При таком расположении курсор не закрывает основной рисунок символа.