Иллюстрированный самоучитель по SVGA

Маскируемый курсор

Действия при удалении курсора

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

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

Подпрограмма Hidepnt

Текст подпрограммы, выполняющей удаление изображения курсора, приведен в примере 6.6. В нем использованы те же переменные, что и в примерах 6.4 и 6.5, а из трех массивов нужен только pntbuff, содержащий ранее сохраненный фон.

Пример 6.6. Восстановление исходного фона на месте рисунка курсора.

Hidepnt pusha сохранение содержимого регистров
push Cur win сохранение исходного окна
mov ax, Winpnt ах = окно с рисунком курсора
mov Cur win, ax Cur win = Winpnt
call setwin установка исходного окна
lea si, pntbuff si = адрес буфера с сохраненным фоном
mov di, Offspnt di = адрес в сегменте видеопамяти
mov ex, pntYsize сх = кол-во повторов внешнего цикла
mov bx, horsize вычисляем константу для
sub bx, pntXsize коррекции адресов строк
hid 1: push ex сохраняем значение счетчика строк
mov ex, pntXsize сх = количество точек в строке рисунка
hid 2: movsb!! копируем байт из pntbuff в видеопамять
or di, di конец сегмента видеопамяти?
jnz @F › нет, обходим следующую команду
call nxtwin устанавливаем следующее окно
@@: loop hid 2 управление повторами цикла
pop ex восстанавливаем счетчик строк
add di, bx корректируем адрес видеопамяти
jnc @F › адрес в пределах текущего окна
call nxtwin установка следующего окна
@@: loop hid_l управление повторами цикла
pop Cur win восстановление значения Cur win
popa восстановление всех регистров
call setwin восстановление исходного окна
ret возврат из подпрограммы

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

Сравнение способов построения

В заключение раздела оценим, что мы получаем и что теряем при работе с маскируемым курсором. Бесспорное преимущество подпрограммы showpnt в том, что возможна работа с изображением курсора, цвет которого зависит только от самого рисунка и не зависит от находящейся на экране картинки. Собственно говоря, ради этого и применяется маскировка.

Но при этом, объем оперативной памяти, необходимый для хранения рабочих массивов, увеличился в три раза. При описанном способе построения изображения курсора сократить его невозможно. Попробуйте самостоятельно ответить на вопрос – почему нельзя временно сохранять исходный фон в массиве pntimage и восстанавливать его содержимое при восстановлении исходного фона?

При построении немаскируемого курсора обработку кода каждой точки выполняли 2 команды внутреннего цикла. В примере 6.5 таких команд стало 5, и сократить их количество невозможно.

Наконец, вместо одной подпрограммы Tgipn.tr при использовании маски нужны две – showpr.t и Hidepr.t. Объединить их в одну подпрограмму невозможно. Включение и выключение курсора это два независимых процесса, которые не могут выполняться одновременно.

Такова реальная плата за улучшение качества изображения и возможность работы с цветным рисунком курсора. Выбор маскировки или отказ от нее зависит от вас.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.