Мышиные
функции (для 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;
}
На этом все.