logo
несколько программ / bsp33

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

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