Скачиваний:
106
Добавлен:
02.05.2014
Размер:
403.46 Кб
Скачать

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

На входе: 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("nnСостояние мыши:nn");

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

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);

}

Соседние файлы в папке input_devices