Аппаратное обеспечение IBM PC

       

Определить содержимое счетчиков перемещения


На входе: AX = 000Bh.

На выходе: CX = перемещение по горизонтали с момента последнего вызова функции;

DX = перемещение по вертикали с момента последнего вызова функции.

Функция позволяет определить относительное перемещение мыши с момента последнего вызова этой функции. Результат возвращается в указанных выше регистрах. Для измерения перемещения используется единица mickey - "мики". Один мик соответствует 0.005 дюйма (т.е. 1/200 дюйма).

Отрицательные значения перемещения означают, соответственно, движение влево и вверх, положительные - вправо и вниз.

Для преобразования миков в пиксели (точки экрана) можно использовать функцию 1Bh, которая будет описана немного позже.

Функция для определения относительного перемещения:

/** *.Name ms_querm *.Title Определение показания счетчика перемещений * *.Descr Эта функция определяет относительное перемещение * мыши с момента последнего вызова функции. * * Определенное состояние записывается в структуру * MOUSE_STATE, описанную в файле sysp.h: * * typedef struct _MOUSE_STATE_ { * unsigned bottoms; * unsigned x; * unsigned y; * } MOUSE_STATE; * * Адрес структуры передается функции в качестве * параметра. Перемещение определяется в миках * - 1/200 долях дюйма. * *.Proto MOUSE_STATE *ms_querm(MOUSE_STATE *state); * *.Params MOUSE_STATE *state - указатель на структуру, * описывающую состояние мыши. * *.Return Функция возвращает значение своего параметра. * *.Sample ms_samp7.c **/

#include <stdio.h> #include <dos.h> #include <conio.h> #include "sysp.h"

union REGS reg;

MOUSE_STATE *ms_querm(MOUSE_STATE *state) {

reg.x.ax = 0xB; int86(0x33,&reg,&reg);

state->bottoms = 0; state->x = reg.x.cx; state->y = reg.x.dx;



return(state); }

Для иллюстрации приведем программу, постоянно вызывающую эту функцию и отображающую на экране величину относительного перемещения мыши:

#include <dos.h> #include <stdio.h> #include <conio.h> #include "sysp.h"

union REGS reg; void main() {


int botm, i; MOUSE_STATE state; unsigned old_videomode, new_videomode; char buf[20], *bufptr;

// Определяем текущий видеорежим

reg.x.ax = 0x0f00; int86(0x10, &reg, &reg); old_videomode = reg.h.al;

// Устанавливаем новый видеорежим:

// Устанавливаем максимально допустимую длину строки

buf[0] = 10; printf("\nВведите десятичный номер видеорежима: "); bufptr = cgets(buf);

// Преобразуем введенное число к формату int

new_videomode = atoi(bufptr);

reg.h.ah = 0; reg.h.al = new_videomode; int86(0x10, &reg, &reg);

// Инициализируем мышь, определяем количество клавиш

if(!ms_init(&botm)) { printf("\nМышь не установлена"); exit(-1); } printf("\n\nСостояние мыши:\n\n");

// Включаем курсор

ms_on();

while(!kbhit()) { ms_querm(&state); printf("x:%5d y:%5d", state.x, state.y); for(i=0;i<15;i++) printf("\b"); } getch();

ms_off();

reg.h.ah = 0; reg.h.al = old_videomode; int86(0x10, &reg, &reg); }


Содержание раздела