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

Формирование кодов событий

В управляющем алгоритме переключатель используется дважды – сначала для обработки событий, связанных с левой, а затем с правой кнопкой. В обоих случаях код события помещается в регистр и удваивается, поскольку списки адресов состоят из слов. После этого команда call вызывает одну из подпрограмм перечисленных в списках choiceL или choiceR. При выполнении этой команды адрес начала списка (значение меток ChoiceL или ChoiceR) суммируется с содержимым регистра bх, в стеке формируется адрес возврата и управление передается нужной подпрограмме.

Обратите внимание на то, что сразу после возвращения из подпрограммы statms код состояния левой кнопки находится в регистре bl. Поэтому при обработке событий левой кнопки нет необходимости копировать его в регистр bl из LBevent. Однако при обработке событий правой кнопки в регистр bl копируется содержимое RBevent.

Списки имен подпрограмм, обрабатывающих события, связанные с левой и правой кнопками, должны быть описаны в разделе данных программы, например, следующим способом:

ChoiceL dw eosub, namel, name2, eosub, motion, паmеЗ, name4, name5

ChoiceR dw eosub, eoprg, патеб, eosub, eosub, name7, nameS, name9

Действия, выполняемые при возникновении каждого из событий, зависят от назначения программы и фантазии программиста. Заведомо очевидны лишь два случая.

Если мышь неподвижна и состояние кнопок не изменилось (коды 0 и 3), то просто ничего не произошло. Этим кодам в обоих списках соответствует имя eosub, которое в примере 6.12 указано перед командой ret.

Если мышь движется и кнопки не нажаты (код 4), то надо просто перемешать курсор. Поэтому на пятом месте в списке choiceL указано имя подпрограммы motion, выполняющей перемещение курсора, ее подробное описание приведено в следующем разделе.

Во втором слове массива choiceR указано имя команды eoprg, начиная с которой выполняются завершающие действия (см. пример 6.11). При нажатии на правую кнопку мыши выполнение задачи прекратится и произойдет возврат в DOS.

Если при подготовке исходного текста программы вы еще не решили, как обрабатывать остальные события, то просто замените имена name1 – name9 именем eosub. Управляющий алгоритм будет игнорировать события, для обработки которых не указаны специальные подпрограммы.

Идентификация графических объектов

Кнопки манипулятора "мышь" используются для управления процессом выполнения задач. Выбор выполняемых действий зависит от объекта, на который указывает курсор. Например, если курсор указывает на элемент меню, то при однократном нажатии на кнопку (обычно левую) этот элемент становится активным и выполняются связанные с ним действия. Нажатие на кнопку во время движения мыши может вызывать перемещение или изменение размеров объекта, на который указывает курсор. При работе в режиме редактирования в этом случае могут изменяться размеры и форма создаваемого объекта.

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

Замечание
Описание процедур, реагирующих на изменение состояния кнопок, выходит за рамки данной книги, поэтому мы ограничимся следующим советом. Начните с составления простой подпрограммы, которая при нажатии левой кнопки проверяет нахождение курсора в прямоугольной области с заданными границами Xmin, Xmax, Ymin, Ymax. Если курсор находится в ней, то подпрограмма завершает выполнение задачи. На экране этим координатам может соответствовать прямоугольник с надписью "Выход" или "Exit". Затем усложните подпрограмму сделав так, чтобы значения указанных границ выбирались из формируемого задачей списка. Следующий шаг – при нахождении объекта в списке выполняется подпрограмма, адрес которой хранится в том же элементе, в котором указаны границы объекта. Так постепенно вы создадите универсальную процедуру для обработки событий, связанных с левой кнопкой
.

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