Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
03.06.2014
Размер:
2.63 Mб
Скачать

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

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

Регистры на входе:

AX = 0003h

Регистры на выходе:

BX = состояние клавиш мыши;

CX = координата X курсора;

DX = координата Y курсора

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

Установленный бит регистра BX

Клавиша, которая была нажата

0

Левая

1

Правая

2

Средняя

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

Размер экрана в пикселах

Номер режима

Диапазон координат по оси 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).

ПрограммаMsgcurs

Приведем исходный текст программы MSGCURS (листинг 3.2), которая запрашивает номер режима видеоадаптера, устанавливает его и динамически отображает координаты курсора, а также состояние клавиш мыши. После завершения работы программа восстанавливает первоначальный режим видеоадаптера.

Листинг 3.2. Файлmsgcurs\msgcurs.c

// =====================================================

// Включение и выключение курсора мыши

// в разных видеорежимах

//

// (C) Фролов А.В, 1997

//

// E-mail: frolov@glas.apc.org

// WWW: http://www.glasnet.ru/~frolov

// или

// http://www.dials.ccas.ru/frolov

// =====================================================

#include <dos.h>

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

union REGS rg;

int main(void)

{

int i;

unsigned old_videomode, new_videomode;

char buf[20], *bufptr;

int nButtons;

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

rg.x.ax = 0x0f00;

int86(0x10, &rg, &rg);

old_videomode = rg.h.al;

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

buf[0] = 10;

printf("Enter new video mode: ");

bufptr = cgets(buf);

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

new_videomode = atoi(bufptr);

rg.h.ah = 0;

rg.h.al = new_videomode;

int86(0x10, &rg, &rg);

// Инициализируем мышь

rg.x.ax = 0;

int86(0x33, &rg, &rg);

if(rg.x.bx == 0)

{

printf("Mouse not found\n");

return -1;

}

// Сохраняем количество клавиш

nButtons = rg.x.bx;

printf("Mouse type: %d\n", nButtons);

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

rg.x.ax = 1;

int86(0x33, &rg, &rg);

printf("Mouse cursor on. Press any key\n");

getch();

while(!kbhit())

{

rg.x.ax = 3;

int86(0x33, &rg, &rg);

printf("%2d x:%5d y:%5d",

rg.x.bx, rg.x.cx, rg.x.dx);

for(i=0; i<18; i++) printf("\b");

}

getch();

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

rg.x.ax = 2;

int86(0x33, &rg, &rg);

// Восстанавливаем режим видеоадаптера

rg.h.ah = 0;

rg.h.al = old_videomode;

int86(0x10, &rg, &rg);

return 0;

}

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

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

Соседние файлы в папке несколько программ