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

       

Определить положение курсора


На входе: AX = 0003h.

На выходе: BX = состояние клавиш мыши:

бит 0 = 1 - нажата левая клавиша; бит 1 = 1 - нажата правая клавиша; бит 2 = 1 - нажата средняя клавиша (для мыши системы Mouse Systems);

CX = координата X (по горизонтали); DX = координата Y (по вертикали).

Функция 03h возвращает текущие (на момент вызова функции) координаты курсора мыши и состояние клавиш.

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

Размер экрана Номер режима Диапазон координат X Y 320x200 4,5 0..638 0..199 640x200 6 0..639 0..199 320x200 0Dh 0..638 0..199 640x200 0Eh 0..639 0..199 640x350 0Fh 0..639 0..349

Программы, работающие в текстовом режиме, должны разделить полученные координаты на 8 (как координату X, так и координату Y).

Приведем функцию, предназначенную для использования в программах, составленных на языке Си:

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

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

union REGS reg;

MOUSE_STATE *ms_query(MOUSE_STATE *state) {



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

state->bottoms = reg.x.bx; 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Установлена мышь: "); switch (botm) { case 2: printf("двухклавишная"); break; case 3: printf("трехклавишная, системы Mouse Systems"); break; case 0: default: printf("неизвестной системы"); break; } printf("\n\nСостояние мыши:\n\n");

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

ms_on();

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

ms_off();

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

}

Однако использование функции 03h - не самый лучший способ работы с мышью. Программа должна постоянно следить за координатами курсора или за состоянием клавиш. Это может привести к непроизводительным затратам процессорного времени на опрос состояния.

Немного позже мы рассмотрим другие способы определения состояния мыши.


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