Аппаратное обеспечение персонального компьютера

       

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

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



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