Программирование на Паскале. Выпуск 9
Мои ближайшие планы: статьи о "неправильном" Паскале, точнее о массивах, длина которых определяется во время выполнении программы, завершить описание объекта, реализующего работу с базой данных, написать статьи о списках и деревьях различных типов, методах сортировки.
Если Вы захотите узнать что-то другое, то пишите. Я обязательно отвечу. Адрес внизу
Сейчас, отвечая на вопрос в гостевой книге , опишу, как в Borland Pascal создавать программы, работающие с мышью.
Писать постараюсь подробнее и не используя, на первых порах, ассемблера. Для тех, кому станет скучно, могу предложить несколько модулей, которые написал тогда, когда сам разбирался, как работает Turbo Vision. В них главное - это объект TCommander, используя который можно писать программы, управляемые событиями. И объект и краткое описание его, а также пример использования, находятся на сайте в виде архива. Их можно скачать. Все это я использовал для обучения объектно-ориентированному программированию школьников.
Программа, работающая с устройством "мышь" в операционной системе MS-DOS, должна использовать прерывание с номером 51 ( в десятичной системе счисления, но привычнее использовать шестнадцатеричное $33). Это специальное прерывание. Оно представляет 36 функций, обеспечивающих настройку устройства "мышь" и его указателя, а также сообщающих информацию о событиях.
Все эти функции получают требуют заполнения регистров процессора перед вызовом их. В частности, номер функции всегда заносится в регистр AX. И в регистрах процессора функции "возвращают" информацию. Конечно, удобнее всего использовать встроенный ассемблер, но сейчас этого делать не будем для якобы упрощения программы. Тогда обращение к регистрам процессора производится с помощью переменной типа REGISTERS, которая описана в модуле DOS.
type Registers = record case Integer of 0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags: Word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: Byte); end;Для вызова прерывания нужно заполнить регистры процессора так, как указано в описании функции, и вызвать процедуру intr. Ей передаются два параметра:
Если мышь имеется, эта функция выполняет следующие действия в текстовом режиме
Внизу находится листинг первой простейшей программы, в которой проверяется, может ли программа получить доступ к мыши. Если "да", то программа входит в цикл, из которого выходит либо по нажатию любой клавиши на клавиатуре, либо по нажатию любой кнопки мыши.
Для того, чтобы определить, не произошло ли чего с мышью, в этой программе используется функция с номером 3 "Опросить положение и состояние кнопок".
При вызове | AX = 3 |
Возвращает | биты регистра BX заполнены в соответствии с
правилом:
|
CX = X координата (горизонтальная) курсора мыши. Для текстового экрана нужно делить на 8,
чтобы получить номер текстовой колонки | |
DX = Y координата (вертикальная) курсора мыши. Для текстового экрана нужно делить на 8,
чтобы получить номер строки |
В данном случае мы только опрашиваем состояние левой и правой кнопок. Если нажата любая из них, программа завершает работу.
program mouse_01; uses DOS, CRT; var r: Registers; BEGIN r.ax:=0; intr($33, r); if r.ax <> $FFFF then begin WriteLn('Мышь не обнаружена'); Halt(1) end; Writeln('Обнаружена мышь. Число кнопок = ',r.bx); r.ax:=1; {Покажем указатель мыши} intr($33, r); repeat r.ax:=3; intr($33, r); until KeyPressed or (r.bx and 3 <> 0); END.
Теперь, когда убедились в том, что с мышью все в порядке, что-нибудь сделаем посложнее. Например, определим, какой символ находится под указателем мыши, когда нажимаем левую кнопку мыши. Листинг программы приводится ниже. В ней все практически все то же, за исключением некоторых моментов:
program mouse_02; uses DOS, CRT; var r: Registers; x, y: Word; BEGIN r.ax:=0; intr($33, r); if r.ax <> $FFFF then begin WriteLn('Мышь не обнаружена'); Halt(1) end; Writeln('Мышь обнаружена с ',r.bx,' кнопками'); r.ax:=1; intr($33, r); repeat r.ax:=3; intr($33, r); if r.bx and 1 <> 0 then begin x:=r.cx div 8; y:=r.dx div 8; r.ax:=2; intr($33, r); gotoXY(1,1); Write(x:2,' ', y:2,' ',chr(mem[SegB800:y*160+x*2]),' '); r.ax:=1; intr($33, r); end; until KeyPressed or (r.bx and 2 <> 0); END.То, что показано в этом выпуске, далеко не исчерпывает всех возможностей работы программы с мышь. Я отмечал, что функций 36, а сейчас мы использовали только первые четыре. Да и работу программы можно организовать умнее, и даже предусмотрено все, чтобы это было сделано ... но, в следующий раз :))
Свои вопросы и предложения присылайте Борису
Мы приглашаем Вас и Ваших друзей к сотрудничеству. Напишите, какая проблема Вас лично интересует - и мы постараемся помочь Вам. Поделитесь со всеми, если Вам удастся найти красивое решение. Присылайте свои программы, и если они хороши, то опубликуем их с обязательным указанием Вашего авторства.
По всем вопросам можно писать либо в Гостевую книгу нашего сайта на www.turbopascal.tk, либо
мне,
Постараюсь ответить на все вопросы и учесть все разумные предложения
Рассылка поддерживается сайтом www.turbopascal.tk. При перепечатке ссылка на сайт обязательна