共有回帖数 0 个
-
鼠标事件(转载)
#include graphics.h
#include stdlib.h
#include dos.h
#include conio.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 Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];
void MouseMath()/*计算鼠标的样子*/
{int i,j,jj,k;
long UpNum[16]={
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f
};
long DownNum[16]={
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
};
for(i=0;i16;i++)
{
j=jj=15;
while(UpNum!=0)
{
up[j]=UpNum%2;
j--;
UpNum/=2;
}
while(DownNum!=0)
{
down[jj--]=DownNum%2;
DownNum/=2;
}
for(k=j;k=0;k--)
up[k]=0;
for(k=jj;k=0;k--)
down[k]=0;
for(k=0;k16;k++)/*四种组合方式*/
{
if(up[k]==0&&down[k]==0)
mouse_draw[k]=1;
else if(up[k]==0&&down[k]==1)
mouse_draw[k]=2;
else if(up[k]==1&&down[k]==0)
mouse_draw[k]=3;
else
mouse_draw[k]=4;
}
}
mouse_draw[1][2]=4;/*特殊点*/
}
/*鼠标光标显示*/
void MouseOn(int x,int y)
{
int i,j;
int color;
for(i=0;i16;i++)/*画鼠标*/
{
for(j=0;j16;j++)
{
pixel_save[j]=getpixel(x+j,y+i);/*保存原来的颜色*/
if(mouse_draw[j]==1)
putpixel(x+j,y+i,0);
else if(mouse_draw[j]==2)
putpixel(x+j,y+i,15);
}
}
}
/*隐藏鼠标*/
void MouseOff()
{
int i,j,x,y,color;
x=MouseX;
y=MouseY;
for(i=0;i16;i++)/*原位置异或消去*/
for(j=0;j16;j++)
{
if(mouse_draw[j]==3||mouse_draw[j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[j]);
}
}
/*鼠标是否加载
MouseExist:1=加载
0=未加载
MouseButton:鼠标按键数目 */
void MouseLoad()
{
_AX=0x00;
geninterrupt(0x33);
MouseExist=_AX;
MouseButton=_BX;
}
/*鼠标状态值初始化*/
void MouseReset()
{
_AX=0x00;
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 MouseStatus()/*鼠标按键情况*/
{
int x,y;
int status;
int press=0;
int i,j,color;
status=0;/*默认鼠标没又移动*/
x=MouseX;
y=MouseY;
while(x==MouseX&&y==MouseY&&status==0&&press==0)
{
if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;
}
if(status)/*移动情况才重新显示鼠标*/
{
for(i=0;i16;i++)/*原位置异或消去*/
for(j=0;j16;j++)
{
if(mouse_draw[j]==3||mouse_draw[j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[j]);
}
MouseOn(MouseX,MouseY);/*新位置显示*/
}
if(press!=0)/*有按键得情况*/
return press;
return 0;/*只移动得情况*/
}
void main()
{int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\tc");
MouseMath();/*计算鼠标形状,一开始必须使用,后面就不用了*/
MouseSetY(0,479);
MouseSetX(0,639);
MouseSetXY(100,100);
outtextxy(400,400,"Author: milo_zy");
outtextxy(370,420,"welcome to www.8623.com");
settextstyle(0,0,4);
outtextxy(100,200,"XP Mouse Demo");
MouseOn(MouseX,MouseY);/*第一次显示鼠标*/
while(!kbhit())
{
switch(MouseStatus())
{/*双键按下画黄点*/
case 1:MouseOff();
putpixel(MouseX,MouseY,YELLOW);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
/*左键按下画红点*/
case 2:
MouseOff();
putpixel(MouseX,MouseY,RED);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
/*右键按下画绿点*/
case 3:
MouseOff();
putpixel(MouseX,MouseY,GREEN);
MouseGetXY();
MouseOn(MouseX,MouseY);break;
default:break;
}
}
closegraph();
}
#include dos.h
#includeconio.h
#includegraphics.h
#includestdio.h
#includestdlib.h
union REGS regs;
/*function's prototype*/
void initgr()
{
int gd=DETECT,gm=0;
registerbgidriver(EGAVGA_driver);
/*register BGI driver */
initgraph(&gd,&gm,"");
} /*initialize the graphic*/
void cursor(int x,int y)
{
line(x,y,x,y+18);
line(x+1,y,x+1,y+18);
line(x,y,x+12,y+12);
line(x+1,y,x+13,y+12);
line(x,y+18,x+4,y+14);
line(x,y+17,x+4,y+13);
line(x+4,y+14,x+6,y+20);
line(x+4,y+13,x+6,y+19);
line(x+6,y+20,x+10,y+18);
line(x+6,y+19,x+10,y+17);
line(x+10,y+18,x+8,y+12);
line(x+10,y+17,x+8,y+11);
line(x+8,y+12,x+12,y+12);
line(x+8,y+11,x+12,y+11);
} /*this is the mouse's cursor,maybe a little ugly*/
int init(int xmi,int xma,int ymi,int yma)
{
int retcode;
regs.x.ax=0;
int86(51,®s,®s);
/*with int86*/
retcode=regs.x.ax;
if(retcode==0)
return 0;
regs.x.ax=7;
regs.x.cx=xmi;
regs.x.dx=xma;
int86(51,®s,®s);
regs.x.ax=8;
regs.x.cx=ymi;
regs.x.dx=yma;
int86(51,®s,®s);
return retcode;
} /*initialize the mouse*/
int readmouse(int *mx,int *my,int *mbutt)
{
int xx0=*mx,yy0=*my,but0=0,mb=0;
int xnew, ynew;
do {
regs.x.ax=3;
int86(51,®s,®s);
xnew=regs.x.cx;
ynew=regs.x.dx;
*mbutt=regs.x.bx;
} while(xnew==xx0 && ynew==yy0 && *mbutt == but0 );
*mx=xnew;
*my=ynew;
mb=(*mbutt);
if(mb)
{
if(mb==1)
return 1;
else
return 0;
}
else
return 0;
} /*read the mouse action*/
void newxy(int *mx,int *my,int *mbutt)
{
int ch,xx0=*mx,yy0=*my,x,y;
int xm,ym;
ch=readmouse(&xm,&ym,mbutt);
if(xm!=xx0||ym!=yy0)
{
switch (ch)
{
case 0:
cursor(xx0,yy0);
cursor(xm,ym);
break;
case 1:
cursor(xx0,yy0);
cursor(xm,ym);
break;
} /*paint the cursor when invoke the mouse's action*/
*mx=xm;
*my=ym;
} /*mouse event handling*/
}
main()
{
int x,y,button;
int gdriver = DETECT , gmode;
initgraph(&gdriver, &gmode, "");
setbkcolor(2);
init(0,640,0,480);
while(1)
{
setcolor(4);
cursor(x,y);
setcolor(2);
cursor(x,y);
newxy(&x,&y,&button);
}
}
#include dos.h
#includeconio.h
#includegraphics.h
#includestdio.h
#includestdlib.h
union REGS regs;
/*function's prototype*/
void cursor(int x,int y)
{
line(x,y,x,y+18);
line(x+1,y,x+1,y+18);
line(x,y,x+12,y+12);
line(x+1,y,x+13,y+12);
line(x,y+18,x+4,y+14);
line(x,y+17,x+4,y+13);
line(x+4,y+14,x+6,y+20);
line(x+4,y+13,x+6,y+19);
line(x+6,y+20,x+10,y+18);
line(x+6,y+19,x+10,y+17);
line(x+10,y+18,x+8,y+12);
line(x+10,y+17,x+8,y+11);
line(x+8,y+12,x+12,y+12);
line(x+8,y+11,x+12,y+11);
} /*this is the mouse's cursor,maybe a little ugly*/
int init(int xmi,int xma,int ymi,int yma)
{
int retcode;
regs.x.ax=0;
int86(51,®s,®s);
/*with int86*/
retcode=regs.x.ax;
if(retcode==0)
return 0;
regs.x.ax=7;
regs.x.cx=xmi;
regs.x.dx=xma;
int86(51,®s,®s);
regs.x.ax=8;
regs.x.cx=ymi;
regs.x.dx=yma;
int86(51,®s,®s);
return retcode;
} /*initialize the mouse*/
int readmouse(int *mx,int *my,int *mbutt)
{
int xx0=*mx,yy0=*my,but0=0,mb=0;
int xnew, ynew;
do {
regs.x.ax=3;
int86(51,®s,®s);
xnew=regs.x.cx;
ynew=regs.x.dx;
*mbutt=regs.x.bx;
} while(xnew==xx0 && ynew==yy0 && *mbutt == but0 );
*mx=xnew;
*my=ynew;
mb=(*mbutt);
if(mb)
{
if(mb==1)
return 1;
else
return 0;
}
else
return 0;
} /*read the mouse action*/
void newxy(int *mx,int *my,int *mbutt)
{
int ch,xx0=*mx,yy0=*my,x,y;
int xm,ym;
ch=readmouse(&xm,&ym,mbutt);
if(xm!=xx0||ym!=yy0)
{
switch (ch)
{
case 0:
cursor(xx0,yy0);
cursor(xm,ym);
break;
case 1:
cursor(xx0,yy0);
cursor(xm,ym);
break;
} /*paint the cursor when invoke the mouse's action*/
*mx=xm;
*my=ym;
} /*mouse event handling*/
}
main()
{
int x,y,button;
int gdriver = DETECT , gmode;
initgraph(&gdriver, &gmode, "");
setbkcolor(2);
init(0,640,0,480);
while(1)
{
setcolor(4);
cursor(x,y);
setcolor(2);
cursor(x,y);
newxy(&x,&y,&button);
if (x==0 &&y==0)
break;
}
}
楼主 2016-02-25 11:51 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知