www.pudn.com > jpeg1.zip > MOUSE.C


/* MOUSE.C Mouse Functions */ 
/* Written in TURBO C V2.0 1-16-1995 */ 
/* 鼠标函数实现 */ 
#include	 
#include	 
#include	"mouse.h" 
 
char Reset()					/* 鼠标复位 */ 
   { inr.x.ax=0; 
     int86(0x33,&inr,&outr); 
     if(outr.x.ax==0) { M_FLAG=OFF; return(0); } 
      else { M_FLAG=ON; return(1); } 
    } 
 
/* 鼠标按键状态查询 */ 
char Left_Pressed() 
   { if(M_FLAG==ON) { 
       inr.x.ax=3; 
       int86(0x33,&inr,&outr); 
       return(outr.x.bx&1); } 
      else return 0; 
    } 
 
char Mid_Pressed() 
   { if(M_FLAG==ON) { 
       inr.x.ax=3; 
       int86(0x33,&inr,&outr); 
       return(outr.x.bx&4); } 
      else return 0; 
    } 
 
char Right_Pressed() 
   { if(M_FLAG==ON) { 
       inr.x.ax=3; 
       int86(0x33,&inr,&outr); 
       return(outr.x.bx&2); } 
      else return 0; 
    } 
 
/* 鼠标位置查询 */ 
void Get_XY(int *x,int *y) 
   { if(M_FLAG==ON) { 
       inr.x.ax=3; 
       int86(0x33,&inr,&outr); 
       *x=outr.x.cx; *y=outr.x.dx; } 
      else { *x=0; *y=0; } 
    } 
 
/* 置光标位置 */ 
void Set_XY(int x,int y) 
   { if(M_FLAG==ON) { 
       inr.x.ax=4; 
       inr.x.cx=x; 
       inr.x.dx=y; 
       int86(0x33,&inr,&outr); } 
    } 
 
/* 设置光标范围 */ 
void Set_X_Range(int min,int max) 
   { if(M_FLAG==ON) { 
       inr.x.ax=7; 
       inr.x.cx=min; 
       inr.x.dx=max; 
       int86(0x33,&inr,&outr); } 
    } 
 
void Set_Y_Range(int min,int max) 
   { if(M_FLAG==ON) { 
       inr.x.ax=8; 
       inr.x.cx=min; 
       inr.x.dx=max; 
       int86(0x33,&inr,&outr); } 
    } 
 
/* 鼠标移动检测 */ 
int  Motion(int *x,int *y) 
   { if(M_FLAG==ON) { 
       inr.x.ax=11; 
       int86(0x33,&inr,&outr); 
       *x=outr.x.cx; *y=outr.x.dx; 
       return(*x||*y); } 
      else return 0; 
    } 
 
/* 标准模式下设置图形光标形状 */ 
void Set_Graphic_Cursor(int x,int y,unsigned int *pattern) 
   { if(M_FLAG==ON) { 
       inr.x.ax=9; 
       inr.x.bx=x; 
       inr.x.cx=y; 
       inr.x.dx=FP_OFF(pattern); 
       sireg.es=FP_SEG(pattern); 
       int86x(0x33,&inr,&outr,&sireg); } 
    } 
 
/* 鼠标位置检测 */ 
int  Mouse_in_Box(int *b) 
  {  if(M_FLAG==ON) { 
       inr.x.ax=3; 
       int86(0x33,&inr,&outr); 
       return((outr.x.cx>=b[0])&&(outr.x.cx<=b[2])&& 
	 (outr.x.dx>=b[1])&&(outr.x.dx<=b[3]))?1:0; } 
      else return 0; 
    } 
 
/* 扩展模式下图形光标作图 */ 
int  Draw_Cursor(int x,int y) 
   { unsigned long a; 
     char i,j; 
     unsigned int loc,block; 
     unsigned char huge *dot,far *buf,huge *q; 
 
     switch(CURSOR) {							/* 光标位图索引 */ 
       case IDC_WAIT   : dot=MK_FP(BitMap,11878+8*1418+1078);	 
			 break;						/* 计时沙漏 */ 
       case IDC_CURSOR : dot=MK_FP(BitMap,11878+8*1418+2102+1078); 
			 break;						/* 标准箭头 */ 
       case IDC_HAND   : dot=MK_FP(BitMap,11878+8*1418+2102*2+1078); 
			 break;						/* 手形 */ 
      } 
     a=(unsigned long)y*DIMX+x;						/* 直接写屏 */ 
     block=(unsigned long)a>>16; 
     a&=0xffff; 
     buf=MK_FP(0xA000,(unsigned int)a); 
     outportb(0x3c4,0x0e); 
     outportb(0x3c5,block^2); 
     for(i=0;i