鼠標的操作是使用dos中斷功能,中斷號:33h
下面給幾個操作鼠標的示例,後面有更詳細的中斷功能說明及代碼。
顯示鼠標:union REGS regs;
regs.x.ax=1;
int86(0x33,®s,®s);
檢查是否被按下: union REGS regs;
regs.x.ax=6;
int86(0x33,®s,®s);
返回值在bx寄存器中;
在實際編程中一般要使用循環不斷的檢驗是否被按下!
檢驗鼠標位置:union REGS regs;
regs.x.ax=3;
int86(0x33,®s,®s);
返回值: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();
}