C 鼠標控制

引自……


鼠標的操作是使用dos中斷功能,中斷號:33h


下面給幾個操作鼠標的示例,後面有更詳細的中斷功能說明及代碼。

顯示鼠標:union REGS regs; 
regs.x.ax=1; 
int86(0x33,&regs,&regs);

檢查是否被按下: union REGS regs; 
regs.x.ax=6; 
int86(0x33,&regs,&regs); 
返回值在bx寄存器中; 
在實際編程中一般要使用循環不斷的檢驗是否被按下!

檢驗鼠標位置:union REGS regs; 
regs.x.ax=3; 
int86(0x33,&regs,&regs); 
返回值:x座標在regs.h.cx 
y座標在regs.h.dx
*/

/*下面是各值對鼠標的設置功能

(1)、功能00H

功能描述: 初始化鼠標,該操作只需要執行一次 
入口參數: AX=00H 
出口參數: AX=0000H——不支持鼠標功能,FFFFH——支持鼠標功能
BX=鼠標按鈕個數(在支持鼠標功能時)
在支持鼠標功能的情況下,鼠標還被設置如下參數: 1、 鼠標指針放在屏幕中央 
2、 如果當前鼠標指針是顯示的,則操作後,鼠標指針被隱藏 


3、 鼠標指針的顯示頁爲0 
4、 根據屏幕的顯示模式顯示鼠標指針:文本—反向顯示矩形塊,圖形—尖頭形狀 
5、 水平象素比=8:8,垂直象素比=16:8 
6、 設置水平和垂直的顯示邊界爲當前顯示模式的最大邊界 
7、 允許光筆仿真 
8、 雙速門檻值=64 

(2)、功能01H

功能描述: 顯示鼠標指針,通常在鼠標初始化後,用此功能顯示其指針 
入口參數: AX=01H 
出口參數: 無 

(3)、功能02H

功能描述: 隱藏鼠標指針,一般在程序結束時,調用此功能 
入口參數: AX=02H 
出口參數: 無 

(4)、功能03H

功能描述: 讀取鼠標位置及其按鈕狀態 
入口參數: AX=03H 
出口參數: BX=按鍵狀態: 位0=1——按下左鍵 
位1=1——按下右鍵 
位2=1——按下中鍵 
其它位——保留,內部使用 
CX=水平位置 
DX=垂直位置 

(5)、功能04H

功能描述: 設置鼠標指針位置 
入口參數: AX=04H,CX=水平位置,DX=垂直位置 
出口參數: 無 

(6)、功能05H

功能描述: 讀取鼠標按鍵信息 
軟件開發網 www.mscto.com


入口參數: AX=05H,BX=指定的按鍵:0—左鍵,1—右鍵,2—中鍵 
出口參數: AX=按鍵狀態,參見功能3H中BX的說明
BX=按鍵次數
CX=水平位置(最後按鍵時)
DX=垂直位置(最後按鍵時) 

(7)、功能06H

功能描述: 讀取鼠標按鈕釋放信息 
入口參數: AX=06H,BX=指定的按鍵:0—左鍵,1—右鍵,2—中鍵 
出口參數: AX=按鍵狀態,參見功能3H中BX的說明
BX=釋放的次數
CX=水平位置(最後釋放時)
DX=垂直位置(最後釋放時) 

(8)、功能07H

功能描述: 設置鼠標水平邊界 
入口參數: AX=07H
CX=最小水平位置
DX=最大水平位置 
出口參數: 無,鼠標有可能因新區域變小而自動移進新區域內 

(9)、功能08H

功能描述: 設置鼠標垂直邊界 
入口參數: AX=08H
CX=最小垂直位置
DX=最大垂直位置 
出口參數: 無,鼠標有可能因新區域變小而自動移進新區域內 

(10)、功能09H

功能描述: 設置圖形鼠標形狀 
入口參數: AX=09H
BX=指針的水平位置
CX=指針的垂直位置
ES:DX=16×16位光標的映象地址 參數說明: (BX,CX)是鼠標的指針在16×16點陣中的位置,(0,0)是左上角; 


ES:DX指向的存儲單元內存放16×16點陣的位映象隱碼,緊跟其後的是16×16點陣的光標掩碼。 
鼠標指針的顯示方法: 位映象隱碼“邏輯與”上屏幕顯示區的內容,然後再用光標掩碼內容“異或”前面運算的結果。 

出口參數: 無 

*/
/*

(11)、功能0AH

功能描述: 設置本文鼠標形狀 
入口參數: AX=0AH
BX=光標類型: 0 — CX和DX的各位含義如下: 位7~0 鼠標指針符號 
位10~8 字符前景色 
位11 亮度 
位14~12 字符背景色 
位15 閃爍 

1 — CX=光標的起始掃描線
DX=光標的結束掃描線 

出口參數: 無 

(12)、功能0BH

功能描述: 讀取鼠標移動計數 
入口參數: AX=0BH 
出口參數: CX=水平移動距離:正數——向右移,負數——向左移
DX=垂直移動距離:正數——向下移,負數——向上移 

(13)、功能0CH

功能描述: 爲鼠標事件設置處理程序 
入口參數: AX=0CH
CX=中斷掩碼 位0=1 ——鼠標指針位置發送變化 
位1=1 ——按下左按鈕 

位2=1 ——釋放左按鈕 
位3=1 ——按下右按鈕 
位4=1 ——釋放右按鈕 
位5=1 ——按下中間按鈕 
位6=1 ——釋放中間按鈕 
位7~15=0 ——保留 

ES:DX=中斷處理程序的地址

在進入中斷處理程序時,有關寄存器的值含義:
  AX=中斷掩碼
  BX=按鍵狀態
  CX=鼠標指針的水平位置
  DX=鼠標指針的垂直位置
  SI=水平位置的變化量
  DI=垂直位置的變化量

出口參數: 無 

(14)、功能0DH

功能描述: 允許光筆仿真 
入口參數: AX=0DH 
出口參數: 無 

(15)、功能0EH

功能描述: 關閉光筆仿真 
入口參數: AX=0EH 
出口參數: 無 

(16)、功能0FH

功能描述: 設置鼠標計數與象素比 
入口參數: AX=0FH
CX=水平比例
DX=垂直比例 
出口參數: 無 

(17)、功能10H

功能描述: 設置鼠標指針隱藏區域 
入口參數: AX=10H
CX=左上角X座標
DX=左上角Y座標
SI=右下角X座標 

DI=右下角Y座標 
出口參數: 無 

(18)、功能13H

功能描述: 設置倍速的閾值,其缺省值爲64 
入口參數: AX=13H
DX=閥值 
出口參數: 無 

(19)、功能14H

功能描述: 替換鼠標事件中斷 
入口參數: AX=14H
CX=中斷掩碼
ES:DX=中斷處理程序的地址 
出口參數: CX=舊的中斷掩碼
ES:DX=舊的中斷處理程序地址 

(20)、功能15H

功能描述: 讀取鼠標驅動器狀態的緩衝區大小 
入口參數: AX=15H 
出口參數: BX=存放鼠標驅動器狀態所需緩衝區的大小 

(21)、功能16H
功能描述: 存儲鼠標驅動器狀態 
入口參數: AX=16H
ES:DX=存儲鼠標驅動器狀態的地址 
出口參數: 無 

(22)、功能17H

功能描述: 重裝鼠標驅動器狀態 
入口參數: AX=17H
ES:DX=鼠標驅動器狀態的地址 
出口參數: 無 

(23)、功能18H

功能描述: 爲鼠標事件設置可選的處理程序 
入口參數: AX=18H
CX=替換中斷掩碼
ES:DX=替換中斷處理程序的地址
CF=0 
出口參數: 無 

*/
/*

(24)、功能19H

功能描述: 讀取替換處理程序的地址 
入口參數: AX=19H
CX=替換中斷掩碼 
出口參數: 若AX=-1——不成功,否則,ES:DX=中斷處理程序的地址 

(25)、功能1AH

功能描述: 設置鼠標的靈敏度,其取值1~100 
入口參數: AX=1AH
BX=水平靈敏度(每8個象素鼠標需要移動的數量,一般爲8)
CX=垂直靈敏度(每8個象素鼠標需要移動的數量,一般爲16)
DX=倍速閥值 
出口參數: 無 

(26)、功能1BH

功能描述: 讀取鼠標的靈敏度 
入口參數: AX=1BH 
出口參數: BX=水平靈敏度
CX=垂直靈敏度
DX=倍速閥值 

(27)、功能1CH

功能描述: 設置鼠標中斷速率 
入口參數: AX=1CH
BX=每秒鐘中斷的次數:0—關中斷,1—30/S,2—50/S,3—100/S,4—200/S 
出口參數: 無 

(28)、功能1DH

功能描述: 爲鼠標指針選擇顯示頁 
入口參數: AX=1DH
BX=顯示頁 
出口參數: 無 

(29)、功能1EH

功能描述: 讀取鼠標指針的顯示頁 軟件開發網 www.mscto.com 
入口參數: AX=1EH 
出口參數: BX=顯示頁 

(30)、功能1FH

功能描述: 禁止鼠標驅動程序 
入口參數: AX=1FH 
出口參數: 若AX=-1——不成功,否則,ES:BX=鼠標驅動程序的地址 

(31)、功能20H

功能描述: 啓動鼠標驅動程序 
入口參數: AX=20H 
出口參數: 無 

(32)、功能21H

功能描述: 鼠標驅動程序復位 
入口參數: AX=21H 
出口參數: 若AX=-1——不成功,否則,BX=2 

(33)、功能22H

功能描述: 設置鼠標驅動程序信息語言 
入口參數: AX=22H
BX=語言代碼:0—英語,1—法語,2—荷蘭語,3—德語,4—瑞典語,5—芬蘭語,6—西班牙語,7—葡萄牙語,8—意大利語 
出口參數: 無 

(34)、功能23H

功能描述: 讀取語種 
入口參數: AX=23H 
出口參數: BX=語言代碼 

(35)、功能24H

功能描述: 讀取鼠標信息 
入口參數: AX=24H 
出口參數: BH=主版本號,BL=輔版本號
CL=中斷請求號
CH=鼠標類型:1-Bus Mouse,2-Serial Mouse,3-InPort Mouse,4-PS/2 Mouse,5-HP Mouse 


(36)、功能25H

功能描述: 讀取鼠標驅動程序信息 
入口參數: AX=25H 
出口參數: AX=鼠標驅動程序信息: 位15 ——0: 驅動程序是.SYS文件,否則,爲.COM文件 
位14——0: 不完全鼠標顯示驅動程序,否則,爲完全的 
位13-12——00: 軟件文本光標 
01: 硬件文本光標 
1X: 圖形光標 

(37)、功能26H

功能描述: 讀取最大有效座標 
入口參數: AX=26H 
出口參數: BX=鼠標驅動程序狀態
CX=最大水平座標
DX=最大垂直座標

*/ 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<graphics.h>
#include<dos.h>
/*鼠標信息宏定義*/
#define WAITING 0xff00
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define RIGHTPRESS 0xff02
#define RIGHTCLICK 0xff20
#define RIGHTDRAG 0xff2a
#define MIDDLEPRESS 0xff04
#define MIDDLECLICK 0xff40
#define MIDDLEDRAG 0xff4c 

#define MOUSEMOVE 0xff08

int hide[16][16], bury[16][16],mousedraw[16][16],pixelsave[16][16];/*分別定義隱碼、掩碼、點值*/
int mousebutton,mouseexist,mouseX,mouseY;
void mousepicture() /*畫心形,可設置其它的圖形*/
{
   int i,j,k;
   long hidenum[16]={
   0xe3c7,0xc183,0x8001,0x0000,
   0x0000,0x0000,0x0000,0x8001,
   0x8001,0xc003,0xe007,0xf00f,
   0xf81f,0xfc3f,0xfe7f,0xffff,
} ; /*隱碼點值,是對點素進行設置*/
long burynum[16]={ 
0x1c38,0x3e7c,0x7ffe,0xffff,
0xffff,0xffff,0xffff,0x7ffe,
0x3ffe,0x3ffc,0x1ff8,0x0ff0,
0x07e0,0x03c0,0x0180,0x0000,
};/*掩碼點值*/
for(i=0;i<16;i++)

   while(hidenum[i]!=0) 
   { 
     for(j=15;j>=0;j--) 
     { 
        hide[i][j]=hidenum[i]%2; 
        hidenum[i]/=2; 
     } /*把隱碼轉化爲0-1*/ 
   } 
   while(burynum[i]!=0) 
   { 
     for(k=15;k>=0;k--) 
     { 
        bury[i][j]=burynum[i]%2; 
        burynum[i]/=2; 
     } 
   } 
   for(k=0;k<16;k++) 
   { 
     if(hide[i][k]==0&&bury[i][k]==0)
       mousedraw[i][k]=1; 
     else if(hide[i][k]==0&&bury[i][k]==1) 

       mousedraw[i][k]=2; 
     else if(hide[i][k]==1&&bury[i][k]==0)
       mousedraw[i][k]=3; 
     else
       mousedraw[i][k]=4; /*期間實行邏輯與和異或*/ 
    } 
  } 
}

void mouseon(int x,int y) /*顯示鼠標*/
{
int i,j;
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
pixelsave[i][j]=getpixel(x+j,y+i);/*取得指定像素的顏色*/
if(mousedraw[i][j]==1)
putpixel(x+j,y+i,6);
if(mousedraw[i][j]==2) /*1、2採用點的邏輯運算判斷進行着色*/
putpixel(x+j,y+i,6);
}
}
}

void mouseoff() /*消失鼠標 */

int i,j,x,y,color;
x=mouseX;
y=mouseY;
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if((mousedraw[i][j]==3)||(mousedraw[i][j]==4)) /*3、4採用點的邏輯運算判斷可否繼續運行*/ 
continue;
putpixel(x+j,y+i,BLACK); /*使其鼠標移動前的位置變爲黑色*/
putpixel(x+j,y+i,pixelsave[i][j]);/*使其恢復指定像素的顏色*/
  }
}
}

/*鼠標是否加載
MouseExist:1=加載
0=未加載
MouseButton:鼠標按鍵數目 */
void mouseload()
{
_AX=0x00;
geninterrupt(0x33);
mouseexist=_AX;
mousebutton=_BX;
}

/*鼠標狀態值初始化*/
void mousereset()
{
_AX=0x00;
geninterrupt(0x33);/*0x33是DOS中斷,是在DOS下通過調用中斷來對鼠標進行操作.*/
}

/*改變鼠標光標形狀
SHAPE sp:爲以上定義的形狀
void MouseShape(SHAPE sp)
{
_BX=sp.hotx;
_CX=sp.hoty;
_ES=FP_SEG(&sp.shape);
_DX=FP_OFF(&sp.shape);
_AX=0x09;
geninterrupt(0x33);
}*/

/*設置鼠標左右邊界
lx:左邊界
gx:右邊界 */
void mousesetX(int lx,int rx)
{
_CX=lx;
_DX=rx;
_AX=0x07;
geninterrupt(0x33);
}

/*設置鼠標上下邊界 
uy:上邊界
dy:下邊界 */
void mousesetY(int uy,int dy)
{
_CX=uy;
_DX=dy;
_AX=0x08;
geninterrupt(0x33);
}

/*設置鼠標當前位置
x:橫向座標
y:縱向座標 */
void mousesetXY(int x,int y)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}

/*設置鼠標速度(缺省值:vx=8,vy=1)
值越大速度越慢 */
void mousespeed(int vx,int vy)
{
_CX=vx;
_DX=vy;
_AX=0x0f;
geninterrupt(0x33);
}

/*獲取鼠標按下鍵的信息*/
/*是否按下左鍵
返回值: 1=按下 0=釋放*/
int leftpress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}

/*是否按下中鍵
返回值同上 */
int middlepress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&4);
}

/*是否按下右鍵
返回值同上 */
int rightpress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}

/*獲取鼠標當前位置*/
void mousegetXY() 

{
_AX=0x03;
geninterrupt(0x33);
mouseX=_CX;
mouseY=_DX;
}
int mousemove()/*鼠標移動;*/
{
int i,j,x,y,color,move,press=0;
x=mouseX;
y=mouseY;
move=0; /*沒移動標誌*/
if(mouseX!=x||mouseY!=y)
{
move=1;/*判斷是否有移動*/
mouseon(mouseX,mouseY);
}
return 1;
}

void main()
{
int gdrive=DETECT,gmode;
initgraph(&gdrive,&gmode,"");
mousepicture();
outtextxy(200,150,"Mouse");
mousesetY(0,getmaxy());
mousesetX(0,getmaxx()); /*設置鼠標移動範圍*/
mousesetXY(100,100);/*
mouseon(mouseX,mouseY);初始鼠標位置*/
while(!kbhit())
{
if(mousemove())
{
mouseoff();
mousegetXY();
mouseon(mouseX,mouseY);
}
}
closegraph();
}

發佈了30 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章