В зависимости от того, какая из кнопок является ведущей (обычно левая), имя подпрограммы, выполняющей перемещение курсора, располагается на пятом месте одного из списков choiceL или choiceR. Указывать это имя на пятом месте обоих списков не имеет смысла. При обработке событий с кодами от 5 до 7 такой проблемы не возникает, поскольку предполагается, что одновременное нажатие обеих кнопок в задачах не используется. Подпрограмма statms не фиксирует этот случай, поскольку состояния кнопок анализируются независимо друг от друга.
Для перемещения изображения курсора надо выполнить следующие действия в такой последовательности: восстановить исходный фон на месте старого изображения, вычислить адрес видеопамяти, соответствующий новому значению координат, и вывести изображение курсора на новом месте (одновременно сохранив исходный фон).
Перечисленные действия выполняет подпрограмма Motion, текст которой приведен в примере 6.13. Кроме нее в текст примера включены еще две подпрограммы, обращение к которым происходит из управляющего алгоритма при нажатии оператором на клавиши с рисунками стрелок, направленных влево, вправо, вверх и вниз. Подпрограмма Mothor перемещает курсор на шаг вправо или влево, a Motver — вверх или вниз. Шаг и направление перемещения задается в регистре bх, для перемещения в сторону уменьшения значений координат его содержимое должно быть отрицательным числом.
Подпрограммы Mother и Motver являются вспомогательными, основные действия выполняет Motion.
Восстановление исходного фона и построение изображения курсора было описано в разделе Немаскируемый курсор и разделе Маскируемый курсор данной главы. Напомним только, что если вы предпочитаете работать с немаскируемым курсором, то вместо подпрограмм Hidepnt и showpnt надо использовать Tgipntr. Способ пересчета значений координат в адрес видеопамяти уже неоднократно обсуждался, остается только применить его в данном конкретном случае.
Мышь не всегда перемещается плавно, поэтому при вычислении адреса видеопамяти не следует исходить из предположения, что курсор перемещается только в одну из смежных точек, показанных в табл. 3.3. Текущие значения координат хранятся в переменных xpointer (номер столбца) и Ypointer (номер строки), которые описаны в примере 6.8. Для вычисления адреса номер строки умножается на размер экрана по горизонтали (horsize), к произведению прибавляется номер столбца и результат корректируется с учетом Grunit. При этом предполагается, что код точки занимает 1 байт, т. е. установлен один из режимов PPG.
Подпрограммы перемещения курсора. Таковы исходные предпосылки и теперь можно обсудить особенности конкретной реализации подпрограммы Motion. Ее текст приведен в примере 6.13.
Образ рисунка курсора можно хранить в любом сегменте оперативной памяти. Учитывая его небольшой размер (294 байта). мы будем считать, что он расположен в сегменте данных (см. пример 6.3) и имеет имя pntimage. Маска при построении не используется, поэтому массив pntmask нас в данном случае не интересует.
Учитывая, что размеры рисунка не фиксированы и зависят от его формы, в разделе данных задачи надо описать две следующие переменные:
PntXsize dw 14 ; количество точек в строке рисунка курсора
pntYsize dw 21 ; количество строк в рисунке курсора
В приведенном описании значения переменных соответствуют размерам рисунка, показанного в примере 6.3.
Курсор является особым рисунком, его координаты в видеопамяти могут использоваться в различных целях. Поэтому они хранятся в специальных переменных, значение которых может изменяться только при перемещении манипулятора "мышь". В примере 6.8 будет описано несколько переменных, используемых при работе с курсором. Здесь нас интересуют только две из них. Переменная winpnt содержит текущее окно видеопамяти, a offspnt — адрес (смешение) точки левого верхнего угла рисунка курсора в этом окне.