Назад, на главную

 

Мышиные функции (для MS DOS)

 

Возможно вы спросите, зачем я занялся столь древним вопросом? Отвечу – на 1-м курсе Нижегородского Политехнического Университета, где учится мой сын, ему задали задачу (предмет – программирование):

 

“Графический экран, мышь.

В центре экрана нарисован прямоугольник.

Когда курсор мыши выходит за границу прямоугольника,

он позиционируется в центр прямоугольника.”

 

                На лекциях им объяснялись прерывания для мыши (соответствующую лекцию можете посмотреть здесь, пусть меня извинит преподаватель за то, что я помещаю ее без разрешения). Кроме того им давалась информация по работе с графической библиотекой Borland (см. здесь).

                В интернете ничего путного насчет досовских библиотек по работе с мышью мне не удалось найти. Поэтому пришлось программировать самому. Вспомнил свои функции на встроенном ассемблере для Borland C 2.0, которые я писал где-то в 1996-1997 годах, и переделал их под мышь. Особо подробно я расписывать не буду, вопрос древний, да и не платит мне никто за это. Сразу скажу, что все написанные функции я не тестировал, но по крайней мере часть их работает отлично. Если в комментариях по ходу программы не будет понятно что обозначает какой параметр функции – смотрите лекцию с «мышиными»  прерываниями (выше). Все должно стать понятно.

                Здесь можете скачать исполняемый файл (в архиве rar). Чтоб он работал, в том же каталоге должен быть и файл Egavga.bgi (он прилагается в архиве).

                А вот и сам текст программы. Заодно можно ознакомиться и с тем, как задействуется Борландовская графическая библиотека.

 

 

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

 

#define LEFT 270

#define RIGHT 370

#define TOP 60

#define BOTTOM 140

 

/* Сперва идут функции для работы с мышью*/

 

unsigned int TestMouseDriver(void) /*Проверка - есть ли драйвер мыши*/

{

 unsigned char r1;

 unsigned char r2;

 unsigned int r;

 

 asm  {

  mov ax,0

  int 33h

  mov r1,al

  mov r2,ah  }

 r=r1+256*r2;

 return r;

}

 

void CrsOn(void)  /* Включение курсора мыши*/

{

 asm  {

  mov ax,1h

  int 33h  }

 return;

}

 

void CrsOff(void)  /* Выключение курсора мыши */

{

 asm  {

  mov ax,2h

  int 33h  }

 return;

}

 

void CrsWhere(int *X,int *Y,int *Kb) /* Определяет где координаты

                                                                                                                                                 курсора и нажата ли кнопка мыши */

{

 int B1;

 int B2;

 int B3;

 

 asm  {

  mov ax,3h

  int 33h

  mov B3,bx

  mov B1,cx

  mov B2,dx  }

 *X=B1;

 *Y=B2;

 *Kb=B3;

 

 return;

}

 

 

void CrsJump(int X,int Y) /* Прыжок курсора */

{

 

 asm  {

  mov ax,4h

  mov cx,X

  mov dx,Y

  int 33h  }

 return;

}

 

void SetPage(int N) /* Установка графической страницы курсора*/

{

 

 asm  {

  mov ax,1dh

  mov bx,N

 

  int 33h  }

 return;

}

 

void SetHorz(int Min,int Max) /* Установка гор.дипазона движ-я курсора*/

{

 

 asm  {

  mov ax,7h

  mov cx,Min

  mov dx,Max

  int 33h  }

 return;

}

 

void SetVert(int Min,int Max) /*Установка верт. диапазона дв-я курсора*/

{

 

 asm  {

  mov ax,8h

  mov cx,Min

  mov dx,Max

  int 33h  }

 return;

}

 

void CrsMask(void) /*Вид курсора - пока тестовая ф-я*/

{

char *pCh;

char Ch[64];

int i;

 

i=0;

while(i<16)

{

Ch[i]=0;

Ch[i+1]=1;

Ch[i+2]=127;

Ch[i+3]=255;

i=i+4;

}

pCh=&Ch[0];

asm {

mov ax,SEG pCh

mov es,ax

mov ax,OFFSET pCh

mov ds,ax

mov ax,9h

mov bx,0

mov cx,0

int 33h }

return;

}

 

void CrsMask1(char *pCrs) /* Вид курсора (пока не тестировалась)*/

{

char *pCh;

 

pCh=pCrs;

asm {

mov ax,SEG pCh

mov es,ax

mov ax,OFFSET pCh

mov ds,ax

mov ax,9h

mov bx,0

mov cx,0

int 33h }

return;

}

 

void PointPress(int N,int *X,int *Y,int *Kb) /* Определяет где координаты

                                                                                                                                                 курсора после нажатия и сколько нажатий */

{

 int B1;

 int B2;

 int B3;

 int N1;

 

 if(N<0) N1=2;

 if(N==0) N1=0;

 if(N>0) N1=1;

 

 asm  {

  mov ax,5h

  mov bx,N1

  int 33h

  mov B3,bx

  mov B1,cx

  mov B2,dx  }

 *X=B1;

 *Y=B2;

 *Kb=B3;

 

 return;

}

 

void PointFree(int N,int *X,int *Y,int *Kb) /* Определяет где координаты

                                                                                                                                                 курсора после отпускания и сколько нажатий */

{

 int B1;

 int B2;

 int B3;

 int N1;

 

 if(N<0) N1=2;

 if(N==0) N1=0;

 if(N>0) N1=1;

 

 asm  {

  mov ax,6h

  mov bx,N1

  int 33h

  mov B3,bx

  mov B1,cx

  mov B2,dx  }

 *X=B1;

 *Y=B2;

 *Kb=B3;

 

 return;

}

 

/* Конец определения "мышиных" функций*/

 

/*Главная функция (точка "входа" в программу)*/

 

int main(void)

{

int graphdriver;

int gmode;

int err;

int R;

int X,Y,K;

int X1,Y1,K1;

int X2,Y2;

int j;

int Co1=5,Co2=6,Co3=7,Co4=8;

int gd=DETECT,gm,res;

int J;

 

     R= TestMouseDriver();

      if(R==0) printf("No mouse driver!\n");

      else printf(" Driver - %d\n",R);

 

printf("Begin! Press any key!..");

getch();

graphdriver = EGA; /*, gmode, errorcode;*/

gmode=EGALO;

 

/*initgraph(&graphdriver,&gmode,"");*/

initgraph(&gd,&gm,"egavga.bgi");

err=graphresult();

/*setactivepage(1);

setvisualpage(1);*/

 

CrsOff();

/*setbkcolor(2);*/

setcolor(4);

/*line(1,1,5,5);*/

setfillstyle(SOLID_FILL,3);

/*bar(LEFT,TOP,RIGHT,BOTTOM);*/

bar(getmaxx()/4,getmaxy()/4,(getmaxx()*3)/4,(getmaxy()*3)/4);

/*X=0;

Y=0;*/

 

/*SetPage(1);*/

/*CrsMask();*/

setcolor(LIGHTGRAY);

CrsOn();

CrsJump(5,5);

CrsOn();

j=0;

K=0;

/*SetHorz(0,RIGHT+25);

SetVert(0,BOTTOM+25);*/

/*J=1;*/

/*CrsOn();*/

J=0;

 

while(j>-1)

{

 

CrsWhere(&X,&Y,&K);

/*if((X<RIGHT)&&(X>LEFT)&&(Y>TOP)&&(Y<BOTTOM)) {*/

if((X<(getmaxx()*3)/4)&&(X>getmaxx()/4)&&(Y>getmaxy()/4)&&(Y<(getmaxy()*3)/4))

{

/*X=320; Y=100;*/

if(J==0) { CrsJump(getmaxx()/2,getmaxy()/2); }

J=1;

}

else {  J=0;  }

 

if(K!=0)

{   PointPress(0,&X1,&Y1,&K1);

                break;

}

 

}

 

/*getch();*/

 

/*CrsOff();*/

X2=getmaxx();

Y2=getmaxy();

 

closegraph();

printf("Err=%d\n",err);

if(err==0) printf("All was correct!\n");

else printf("There was error!\n");

printf("X=%d\n",X);

printf("Y=%d\n",Y);

printf("X1=%d\n",X1);

printf("Y1=%d\n",Y1);

 

printf("maxX=%d\n",X2);

printf("maxY=%d\n",Y2);

printf("it was number of testing values. Press any key to finish!\n");

getch();

 

return 0;

}

 

 

На этом все.        

 

 

 

Хостинг от uCoz