Название: Подключение "мыши" в С/С++ Отправлено: Артем от Май 17, 2008, 07:08:11 Думаю, что этот материал может понадобиться некоторым студентам потока ИУС-07, которые собираются делать в 6-ом выче пользовательский интерфейс с подключением "мыши" :)
Основные теоретические сведения На сегодняшний день на рынке персональных компьютеров имеется большое количество различных типов «мышей». Они отличаются в основном разными способами преобразования физического перемещения «мыши» в последовательность электрических сигналов, передаваемых в компьютер. Для этой цели используются всевозможные колесики, шарики и светоотражающие решетки (дифракционные решетки). Помимо «мыши», имеются также и другие устройства, которые эмулируют «мышь» программными средствами, используя в качестве источника сигналов различные джойстики, шаровые манипуляторы (trackballs), сенсорные подушечки (touch pads) и т. д. Методика программного управления «мышью» Для работы по управлению манипулятором прикладная программа выполняет различные функции прерывания 0x3316 (5110). Его обработчик представляет собой коллекцию функций, образующих интерфейс прикладной программы с драйвером манипулятора. Существует набор функций, единый для всех типов драйверов «мыши». Номера функций строго зарезервированы, и меняться по ходу программы не могут. Для вызова необходимой функции её номер задаётся в регистре центрального процессора АХ. Если требуются дополнительные параметры, они помещаются в другие регистры (BX, CX, DX, BL и т. д.) процессора подобным образом. Далее производится запрос на прерывание. В случае, если в результате работы функция возвращает какие либо значения, они также помещаются в регистры центрального процессора. Одним из способов вызова функции драйвера «мыши» является метод, в котором используются промежуточные переменные, описанные в структуре REGPACK. Структура REGPACK объявлена в заголовочном файле <dos.h> следующим образом: Код: (cpp) struct REGPACK Код: (cpp) void intr(int intr_num, struct REGPACK *preg); Основные операции для работы с «мышью» Каждая программа, использующая в своей работе «мышь», должна выполнить ряд операций:
Некоторые из вышеописанных операций могут быть проведены при инициализации, другие могут неоднократно повторяться в ходе работы прикладной программы. Рассмотрим наиболее часто встречающиеся операции и функции драйвера «мыши», при помощи которых эти операции можно осуществить. Инициализация Функция 0 выполняет установку драйвера «мыши» и чтение текущегоего состояния. Для выполнения этой функции в регистр АХ процессора необходимо поместить нулевое значение. Других параметров для работы функции не требуется. Если после выполнения функции в регистре АХ осталось нулевое значение, то при инициализации «мыши» произошла ошибка (проблемы с подключением аппаратной части, либо не загружен драйвер). В противном случае -«мышь» готова к работе, при этом значение в регистре BX позволяет определить режим работы манипулятора. Если BX равно двум, то активны две кнопки «мыши» (режим Microsoft mode), если - трем, то три кнопки (режим Mouse Systems mode). При успешной инициализации «мыши» функция определяет текущий режим экрана, и с учетом этого определяет начальные настройки драйвера манипулятора. Установки драйвера «мыши» по умолчанию:
Позиционирование курсора При перемещении манипулятора по столу драйвер перемещает курсор «мыши» по экрану без участия программы. Тем не менее, прикладная программа имеет возможность управлять позицией курсора. Для этого используется функция 4, которая устанавливает курсор в позицию, заданную значениями, помещенными в регистры CX (горизонтальная координата) и DX (вертикальная координата). Новые координаты задаются для графического режима в пикселах, для текстового режима - в «виртуальных» пикселах (с учетом текстовой строки и столбца). При этом значения в регистрах CX и DX должны быть в пределах диапазона, установленного для перемещения «мыши». Например, в стандартном текстовом режиме C80 используется видеоадаптер типа CGA, разрешение которого 640x200 "виртуальных" пикселей. При этом шаг перемещения мыши составляет 8 "виртуальных" пикселей. Таким образом получается 640/8 = 80 знакомест по горизонтали, и 200/8 = 25 знакомест по вертикали. Ниже приведен пример программы (функции) перемещающей курсор «мыши» в точку с координатами x и y. Код: (cpp) struct REGPACK ioregs; Визуализация курсора Достаточно часто при работе с графикой возникают ситуации, когда необходимо изменить изображение на экране. Все трансформации графической информации на экране следует выполнять с выключенным курсором во избежание непредвиденных ситуаций, так как изменения, проведенные точно под курсором, не будут «известны» драйверу и при перемещении курсора в новую позицию экрана драйвер восстановит не новое, а прежнее значение видеопамяти. Чтобы исключить ошибки при выполнении данной операции необходимо перед ее началом «выключить» курсор «мыши» (сделать его невидимым), а после операции вновь визуализировать курсор («включить»). Эти действия выполняют функции 2 и 1 соответственно. Функция 2 делает курсор невидимым на экране. Функция 1 делает курсор видимым. При работе с этими функциями следует помнить, что на каждое «выключение» курсора необходимо выполнить обратную операцию, т. е. визуализировать его, несмотря на то, что курсор может быть невидим на экране, продолжается отслеживание движения «мыши». При каждом переключении режима экрана функция 2 вызывается автоматически. В конце программы в обязательном порядке необходимо вызывать функцию 2 (это позволит вам быть уверенным в том, что ничего лишнего не останется на экране по завершении работы программы). Определение местоположения и состояния клавиш «мыши» Для определения текущего состояния и местоположения курсора «мыши» используются функции 3, 5, 6 и 11. Функция 3 возвращает данные по текущему состоянию клавиш «мыши» и положению курсора на экране. Горизонтальная координата располагается в регистре CX, а вертикальная - в DX. В регистр ВX помещается байт состояния клавиш, в котором бит 0 отвечает за состояние левой клавиши «мыши», бит 1 - за состояние правой клавиши, а бит 2 - за состояние средней клавиши (режим Mouse Systems). Если бит имеет единичное значение, то клавиша была нажата, в противном случае нажатия клавиши не было. Функции 5 и 6 определяют соответственно количество нажатий и отпусканий клавиш «мыши». Для их выполнения необходимо сформировать запрос и поместить его в регистр BX (бит 0 отвечает за левую клавиши «мыши», биты 1 и 2 - за правую и среднюю клавиши соответственно). В результате выполнения в регистре BX появляется информация о числе нажатий (отпусканий) клавиш манипулятора с момента последнего обращения к функциям или с момента инициализации «мыши», если выполняемый запрос - первый. Счетчик числа нажатий может хранить значения в диапазоне от 0 до EFFFh. После вызова функций 5 или 6 значения счетчика обнуляются. Функция 11 возвращает число сигналов микки (минимальных приращений перемещения «мыши», регистрируемых аппаратными средствами), накопленное счетчиком с момента последнего вызова данной функции. Границы перемещения курсора Сразу после инициализации экрана областью допустимых перемещений курсора по умолчанию принимается весь экран. Но всегда имеется возможность ограничить перемещение курсора. Для этого программа должна использовать функции 7, 8 и 16 прерывания 0x33. Функции 7 и 8 устанавливают диапазон перемещения курсора по горизонтали и вертикали соответственно. Дополнительной входной информацией для этих функций являются минимальное и максимальное значение координатного диапазона, которые помещаются в регистры CX и DX. Если в момент вызова функции какая либо координата курсора находилась вне указанного диапазона, курсор перемещается на соответствующую границу. Функция 16 запрещает появление курсора в специальной области. Форма курсора Драйвер «мыши» поддерживает работу с тремя разновидностями курсора - жестким (аппаратным) текстовым курсором, мягким (программируемым) текстовым курсором и графическим курсором. Только один курсор может присутствовать на экране в любой момент времени. Наибольший практический интерес представляет графический режим работы видеоадаптера, когда курсор имеет вид некоторого графического объекта, перемещающегося поверх изображения на экране. Этот курсор описывается некоторым блоком, имеющим прямоугольную форму. Когда такой блок перемещается по экрану и взаимодействует с пикселами изображения, находящегося «под» ним, происходит формирование фона и изображения графического курсора. Результат этого взаимодействия определяется содержимым двух массивов, размером 16 на 16 бит каждый, один из которых является маской экрана (AND-маской), другой - маской курсора (XOR-маской). Маска экрана определяет, какая часть пикселов графического блока курсора будет формировать образ курсора, а какая часть будет фоном курсора. Маска курсора определяет те пикселы, которые будут участвовать в формировании цвета курсора. В таблице представлены варианты возможных сочетаний битов AND-маски и XOR-маски и результат их взаимодействия. Бит AND-маски Бит XOR-маски Результирующий бит 0 0 0 0 1 1 1 0 не изменится 1 1 инвертируется Для каждой поддерживаемой драйвером функции «мыши» под положением графического курсора на экране подразумевались координаты некоторой точки экрана, находящиеся под блоком курсора и носящие название «горячего пятна» (hot spot) курсора. Обычно (по умолчанию) «горячим пятном» курсора является левый верхний угол графического блока курсора с относительными координатами (0, 0), но по желанию в качестве «горячего пятна» можно выбрать любую другую точку блока. Функция, которая устанавливает цвет, форму и задает координаты «горячего пятна» графического курсора, имеет номер 9. Как уже отмечалось выше, курсор формируется из графического блока размером 16 на 16 пикселов и определяется двумя массивами 16 на 16 бит каждый. Координаты «горячего пятна» должны находиться в диапазоне от 0 до 16. В этой связи для успешной работы функции необходимо в регистры BX и CX поместить горизонтальную и вертикальную координаты «горячего пятна» курсора, а в регистры ES:DX указатель на массивы масок (16 слов - маска экрана и 16 слов - маска курсора). Каждое слово задает значения 16 пикселов в соответствующем ряду. Младший бит соответствует крайнему правому пикселу. Пример функции, формирующей другую форму курсора «мыши» (стрелка из левого нижнего угла в правый верхний), представлен ниже: Код: (cpp) struct REGPACK ioregs; Пример подключения драйвера "мыши" и визуализации курсора в текстовом режиме (для графического режима, перед подключением "мыши", просто включите графический режим с помощью ф-ии initgraph): Код: (cpp) #include <dos.h> Название: Re: Подключение "мыши" в С/С++ Отправлено: Alder от Май 18, 2008, 03:58:22 А у меня вот такой файлик admouse.h был написан:
Код: (cpp) #include <stdio.h> |