Программа 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 - не самый лучший способ работы с мышью. Программа должна постоянно следить за координатами курсора или за состоянием клавиш. Это может привести к непроизводительным затратам процессорного времени на опрос состояния.
Позже мы рассмотрим другие способы определения состояния мыши.