标题:C图形模式下 鼠标的 显示
只看楼主
ymqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:141
专家分:143
注 册:2010-7-14
结帖率:73.33%
已结贴  问题点数:30 回复次数:11 
C图形模式下 鼠标的 显示
如题。C语言图形模式下,如何显示鼠标。
搜索更多相关主题的帖子: 鼠标 图形 模式 
2010-07-24 17:01
ymqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:141
专家分:143
注 册:2010-7-14
得分:0 
还是不知!!!

[ 本帖最后由 ymqq 于 2010-7-25 19:06 编辑 ]
2010-07-24 17:23
ccmike98
Rank: 2
来 自:苏州
等 级:论坛游民
帖 子:76
专家分:56
注 册:2010-7-13
得分:15 
什么时候才能懂这些
2010-07-24 18:16
ymqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:141
专家分:143
注 册:2010-7-14
得分:0 
说实话,这个函数 也没多大用啊!!
2010-07-25 13:20
ymqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:141
专家分:143
注 册:2010-7-14
得分:0 
我把 原来的一个函数 删了(没什么用),希望大虾能来帮一下!!!
2010-07-25 19:07
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:15 
我这儿就有,你看看#include <stdio.h>
#include <dos.h>
void initMouse()
{union REGS reg;
reg.x.ax=0;int86(0x33,&reg,&reg);
if(reg.x.ax!=0xffff)  printf ("Mouse Driver not detected. ");
reg.x.ax=1;int86(0x33,&reg,&reg);
}
void getMouse(int *x,int *y,int *button)
{ union REGS reg;
reg.x.ax=3; int86(0x33,&reg,&reg);
*x=reg.x.cx ;  *y=reg.x.dx ;  *button=reg.x.bx ;
}
void hideMouse()
{ union REGS reg;
reg.x.ax=2; int86(0x33,&reg,&reg);
}
main()
{
int x,y,z;
clrscr();   initMouse();
while(!kbhit())
{  getMouse(&x,&y,&z);
gotoxy(1,1);
printf("\rMouse virtual co-ords=\t%d,\t%d",x,y);
gotoxy(1,2);  printf(" buttons value =%1d",z);
}
hideMouse();
}


欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-27 13:37
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:0 
程序代码:
#ifndefZXF_MOUS_C_INCLUDE

#defineZXF_MOUS_C_INCLUDE

#include&lt;dos.h&gt;

#include&lt;time.h&gt;



intMouseHolded=0;/*是否支持鼠标功能:0--不支持,1--支持*/

intMouseButtonNum=0;/*当支持鼠标功能时,存放鼠标的按钮数*/

intMouseX=0;/*存放鼠标的水平方向的值*/

intMouseY=0;/*存放鼠标的垂直方向的值*/

charMouseType=1;/*设置鼠标类型:1--为箭头型,2--编辑型*/

#defineMouseStatusMouseOn1/*在MouseStatus()中实时显示鼠标*/

#defineMouseStatusMouseOff2/*在MouseStatus()中不实时显示鼠标*/



#defineMouseDoubleClickTime0.3/*鼠标双击的最大时间间隔*/

clock_tLastMouseClickTime=0;/*上一次鼠标单击的时间*/

clock_tNowMouseClickTime=0;/*这次鼠标单击的时间*/

charMouseClickType=0;/*上一次鼠标单击是左键还是右键:1--左键,2--右键*/



intarrowMousePixSave[16][10];/*用于保存鼠标即将覆盖的区域*/

intarrowMouseDraw[16][10]={/*设计鼠标的形状,其中1:表示鼠标的边界,2:表示鼠标边界所包围的区域,3:表示鼠标以外的区域*/

{1,1,3,3,3,3,3,3,3,3},

{1,2,1,3,3,3,3,3,3,3},

{1,2,2,1,3,3,3,3,3,3},

{1,2,2,2,1,3,3,3,3,3},

{1,2,2,2,2,1,3,3,3,3},

{1,2,2,2,2,2,1,3,3,3},

{1,2,2,2,2,2,2,1,3,3},

{1,2,2,2,2,2,2,2,1,3},

{1,2,2,2,2,2,2,2,2,1},

{1,2,2,2,2,2,2,1,3,3},

{1,2,2,2,2,2,1,3,3,3},

{1,2,1,3,1,2,2,1,3,3},

{1,1,3,3,1,2,2,1,3,3},

{3,3,3,3,3,1,2,2,1,3},

{3,3,3,3,3,1,2,2,1,3},

{3,3,3,3,3,3,1,2,2,1}};

inteditMousePixSave[15][5];

inteditMouseDraw[15][5]={

{1,1,3,1,1},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{3,3,1,3,3},

{1,1,3,1,1}};



voidMountMouse();/*加载鼠标*/

voidUnmountMouse();/*卸载鼠标*/

voidDrawMouseOnly(int,int);/*绘画鼠标,但不保存即将被鼠标覆盖的区域*/

voidMouseOn(int,int);/*显示鼠标,但保存即将被鼠标覆盖的区域*/

voidMouseOff(int,int);/*隐藏鼠标*/

voidSetMouseHoriBound(int,int);/*设置鼠标水平方向边界*/

voidSetMouseVertBound(int,int);/*设置鼠标垂直方向边界*/

voidSetMouseXY(int,int);/*设置鼠标的初始位置*/

voidGetMouseXY();/*获得鼠标的当前位置*/

voidMouseSpeed(int,int);/*设置鼠标的速度*/

intMouseStatus(int);/*获得鼠标按键状态*/

voidTimer(long);/*计时器*/



voidTimer(longgetTime)/*计时器*/

{

clock_tstartTime=clock();

clock_tendTime=clock();

while((endTime-startTime)&gt;=getTime)

{

endTime=clock();

}

return;

}

/*加载鼠标*/

voidMountMouse()

{

_AX=0x00;/*功能00H*/

geninterrupt(0x33);/*0x33:鼠标中断类型*/



MouseHolded=_AX;/*_AX为0000H――不支持鼠标功能,为FFFFH――支持鼠标功能*/

MouseButtonNum=_BX;/*鼠标按钮个数*/

}



/*卸载鼠标*/

voidUnmountMouse()

{

_AX=0x02;/*功能02H*/

geninterrupt(0x33);/*0x33:鼠标中断类型*/

return;

}



/*设置鼠标水平边界:minX为水平方向的最小值,maxX为水平方向的最大值*/

voidSetMouseHoriBound(intminX,intmaxX)

{

_AX=0x07;

_CX=minX;

_DX=maxX;

geninterrupt(0x33);

return;

}



/*设置鼠标垂直边界:minY为垂直方向的最小值,maxY为垂直方向的最大值*/

voidSetMouseVertBound(intminY,intmaxY)

{

_AX=0x08;

_CX=minY;

_DX=maxY;

geninterrupt(0x33);

return;

}



/*设置鼠标指针位置:xValue为水平方向位置,yValue为垂直方向的位置*/

voidSetMouseXY(intxValue,intyValue)

{

_AX=0x04;

_CX=xValue;

_DX=yValue;

geninterrupt(0x33);

return;

}



/*读取鼠标位置*/

voidGetMouseXY()

{

_AX=0x03;

geninterrupt(0x33);



MouseX=_CX;/*将鼠标水平方向位置存放到MouseX*/

MouseY=_DX;/*将鼠标垂直方向位置存放到MouseY*/

return;

}



/*设置鼠标速度*/

voidMouseSpeed(intxSpeed,intySpeed)

{

_CX=xSpeed;

_DX=ySpeed;

_AX=0x0f;

geninterrupt(0x33);

}



/*绘画鼠标,但不保存即将被鼠标覆盖的区域*/

voidDrawMouseOnly(intmousex,intmousey)

{

inti,j;

intcolor;



if(MouseType==1)

{

for(i=0;i&lt;16;i++)

for(j=0;j&lt;10;j++)

{

if(arrowMouseDraw[j]==1)

putpixel(mousex+j,mousey+i,0);

elseif(arrowMouseDraw[j]==2)/*画鼠标*/

putpixel(mousex+j,mousey+i,15);

}

}

elseif(MouseType==2)

{

for(i=0;i&lt;15;i++)

for(j=0;j&lt;5;j++)

{

if(editMouseDraw[j]==1)/*由于编辑鼠标的热点在鼠标的中心*/

putpixel(mousex-2+j,mousey-7+i,0);

}

}

}



/*显示鼠标,但保存即将被鼠标覆盖的区域*/

voidMouseOn(intmousex,intmousey)

{

inti,j;

intcolor;



if(MouseType==1)

{

for(i=0;i&lt;16;i++)

for(j=0;j&lt;10;j++)

{

arrowMousePixSave[j]=getpixel(mousex+j,mousey+i);/*保存原来的颜色*/

if(arrowMouseDraw[j]==1)

putpixel(mousex+j,mousey+i,0);

elseif(arrowMouseDraw[j]==2)/*画鼠标*/

putpixel(mousex+j,mousey+i,15);

}

}

elseif(MouseType==2)

{

for(i=0;i&lt;15;i++)

for(j=0;j&lt;5;j++)

{

editMousePixSave[j]=getpixel(mousex-2+j,mousey-7+i);

if(editMouseDraw[j]==1)/*由于编辑鼠标的热点在鼠标的中心*/

putpixel(mousex-2+j,mousey-7+i,0);

}

}

}



/*隐藏鼠标*/

voidMouseOff(intmousex,intmousey)

{

inti,j,x,y,color;

x=mousex;

y=mousey;



if(MouseType==1)

{

for(i=0;i&lt;16;i++)

for(j=0;j&lt;10;j++)

{

if(arrowMouseDraw[j]==3)

continue;

color=getpixel(x+j,y+i);

putpixel(x+j,y+i,color^color);/*原位置异或清除*/

putpixel(x+j,y+i,arrowMousePixSave[j]);/*还原原背景*/

}

}

elseif(MouseType==2)

{

for(i=0;i&lt;15;i++)

for(j=0;j&lt;5;j++)

{

if(editMouseDraw[j]==3)

continue;

color=getpixel(x-2+j,y-7+i);

putpixel(x-2+j,y-7+i,color^color);/*原位置异或清除*/

putpixel(x-2+j,y-7+i,editMousePixSave[j]);/*还原原背景*/

}

}

}



/*获取鼠标状态*/

intMouseStatus(intMouse_On_Off)

{

intMouseMSG=0;

intoldMouseX,oldMouseY;

inti,j,color;



oldMouseX=MouseX,oldMouseY=MouseY;/*保存当前鼠标的位置*/



_AX=0x03;/*读取鼠标按钮状态*/

geninterrupt(0x33);/*产生33号鼠标软中断*/



if((_BX&1)&&!(_BX&2))/*鼠标左键被按下同时右键没有按下*/

MouseMSG=4;



if((_BX&2)&&!(_BX&1))/*鼠标右键被按下同时左键没有按下*/

MouseMSG=5;



if(_BX&1&&_BX&2)/*鼠标左键和右键同时被按下*/

MouseMSG=3;



_AX=0x06;/*读取鼠标按钮释放信息*/

_BX=0x00;/*指定读取鼠标左键的释放信息*/

geninterrupt(0x33);/*产生33号鼠标软中断*/

if(_BX==1)/*如果鼠标左键的释放数为1*/

MouseMSG=2;/*产生一个单击左键信息*/



_AX=0x06;/*读取鼠标按钮释放信息*/

_BX=0x01;/*指定读取鼠标右键的释放信息*/

geninterrupt(0x33);/*产生33号鼠标软中断*/

if(_BX==1)/*如果鼠标左键的释放次数为1*/

MouseMSG=1;/*产生一个单击右键信息*/



GetMouseXY();/*获得当前鼠标位置,并把数据赋给MouseX,MouseY*/



if(Mouse_On_Off==MouseStatusMouseOn)/*实时显示*/

if(oldMouseX!=MouseX||oldMouseY!=MouseY)

{

MouseOff(oldMouseX,oldMouseY);

MouseOn(MouseX,MouseY);

}



/*鼠标双击的判断*/

if(MouseMSG==3)/*如果是同时按下鼠标的左键*/

MouseClickType=0;/*上一次的按键是既不是鼠标左键也不是鼠标右键*/

elseif(MouseMSG==1)/*如果是按下鼠标的右键*/

{

if(MouseClickType==2)/*如果上一次也是按下鼠标的右键*/

{

NowMouseClickTime=clock();/*获得现在的程序运行时间*/

/*判断上一次按下鼠标的右键到这次按下鼠标右键的时间间隔是不是小于最大鼠标双击时间间隔*/

if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)&lt;=MouseDoubleClickTime)

MouseMSG=6;/*鼠标消息为右键双击*/

LastMouseClickTime=NowMouseClickTime;

}

else

{

MouseClickType=2;/*作为下一次的按键判断时的上一次按键状态*/

NowMouseClickTime=clock();/*作为下一次的按键判断时的上一次按键时间*/

LastMouseClickTime=NowMouseClickTime;

}

}

elseif(MouseMSG==2)

{

if(MouseClickType==1)

{

NowMouseClickTime=clock();/*获得现在的程序运行时间*/

/*判断上一次按下鼠标的左键到这次按下鼠标左键的时间间隔是不是小于最大鼠标双击时间间隔*/

if(((NowMouseClickTime-LastMouseClickTime)/CLK_TCK)&lt;=MouseDoubleClickTime)

MouseMSG=7;/*鼠标消息为左键双击*/

LastMouseClickTime=NowMouseClickTime;

}

else

{

MouseClickType=1;/*作为下一次的按键判断时的上一次按键状态*/

NowMouseClickTime=clock();/*作为下一次的按键判断时的上一次按键时间*/

LastMouseClickTime=NowMouseClickTime;

}

}



returnMouseMSG;/*返回鼠标按键消息:0--没有按键,1--单击右键,

2--单击左键,3--同时按下左键和右键,

4--拖曳左键,5--拖曳右键,6--双击右键,7--双击左键*/

}
总算找到了,很长哦

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-27 13:38
ymqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:141
专家分:143
注 册:2010-7-14
得分:0 
怎么用啊?
2010-08-07 15:56
vs303791832
Rank: 2
来 自:地球
等 级:论坛游民
帖 子:87
专家分:12
注 册:2010-6-23
得分:0 
以我的知识我目前看不懂...

小白无敌,哈哈.......我成功了
2010-08-07 16:03
不归鹄
Rank: 9Rank: 9Rank: 9
来 自:冥王星
等 级:蜘蛛侠
威 望:4
帖 子:491
专家分:1380
注 册:2009-12-20
得分:0 
回复 7楼 sunyh1999
当斑竹不易啊,下次看到提名,最好还是弃权比较好

2010-08-07 16:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-313890-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.233689 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved