C中的鼠标使用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C中的鼠标使用.txt3努力奋斗,天空依旧美丽,梦想仍然纯真,放飞自我,勇敢地飞翔于梦想的天空,相信自己一定做得更好。

4苦忆旧伤泪自落,欣望梦愿笑开颜。

5懦弱的人害怕孤独,理智的人懂得享受孤独
在用户自己的图形环境下应用鼠标,不但使软件界面非常友好、便于操作,而且也是一件非常有趣的事情。

当然,你可以设计自己的鼠标驱动程序,不过那要更专业、更麻烦一些。

本文主要是利用已有的鼠标驱动程序,通过 0x33H号中断调用来编写一个有趣的程序。

关于0x33H 号鼠标中断调用中,各子功能所实现的功能,您可以查阅相关的书籍。

现仅把本程序中所用到的几个功能号说明如下:
功能号实现的功能
00h 复位光标
01h 显示光标
02h 隐藏光标
03h 查询光标状态
07h 设置光标水平
移动区域
08h 设置光标垂直
移动区域
在C语言中,鼠标中断调用是通过函数int86(num,in_regs,out_regs)来实现的。

其中:num 是中断调用号,in_regs 是中断调用时的输入值,out_regs 是中断结束后的返回值。

具体的函数调用方法,您可以查阅手册,也可以参考本程序中的用法。

本程序运行后,屏幕被划分成两个窗口:一个是鼠标窗口,另一个是状态窗口。

移动鼠标或按键,相应的鼠标位置和按键状态在状态窗口中给出。

本程序在 Turbo C 2.0 环境下调试通过。

#include 〈graphics.h〉
#include 〈alloc.h〉
#include 〈stdlib.h〉
#include 〈string.h〉
#include 〈stdio.h〉
#include 〈time.h〉
#include 〈dos.h〉
#define DZH 16
int main()
{ int gd=DETECT,gm;
struct viewporttype vpbase,vptitle,vpgraph;
int x,y,x_cur,y_cur;
int lpx,lpy,rpx,rpy;
union REGS mregs;
unsigned char str[]=“Mouse position:",message[80];
unsigned char lfold,rhold,lf[]=“R",rh[]=“R";
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,“");/*初始化图形环境*/
getviewsettings(&vpbase);/*设置窗口系统*/
rectangle(vpbase.left,vpbase.top,vpbase.right,vpbase.bottom);
line(vpbase.left,vpbase.top+DZH+2,vpbase.right,vpbase.top+DZH+2);
setviewport(vpbase.left+1,vpbase.top+1,vpbase.right-1,vpbase.top+DZH+1,vpbase.clip);
getviewsettings(&vptitle);
setviewport(vptitle.left,vptitle.bottom+2,vptitle.right,vpbase.bottom-1,vptitle.clip);
getviewsettings(&vpgraph);
setviewport(vptitle.left,vptitle.top,vptitle.right,vptitle.bottom,vptitle.clip);
settextjustifyCENTER_TEXTCENTER_TEXT);
x=(vptitle.right-vptitle.left)/2+1;
y=(vptitle.bottom-vptitle.top)/2+1;
mregs.x.ax=0; /*复位鼠标*/
int86(0x33,&mregs,&mregs);
mregs.x.ax=7; /*设置水平方向光标的移动范围*/ mregs.x.cx=vpgraph.left;
mregs.x.dx=vpgraph.right;
int86(0x33,&mregs,&mregs);
mregs.x.ax=8; /*设置垂直方向光标的移动范围*/ mregs.x.cx=vpgraph.top;
mregs.x.dx=vpgraph.bottom;
int86(0x33,&mregs,&mregs);
mregs.x.ax=1; /*显示光标*/
int86(0x33,&mregs,&mregs);
mregs.x.ax=3; /*读光标状态*/
int86(0x33,&mregs,&mregs);
x_cur=mregs.x.cx;
y_cur=mregs.x.dx;
switch(mregs.x.bx)/*检查按键状态*/
{ case 0:
lfold=lf[0]='\xDF';
rhold=rh[0]='\xDF';
break;
case 1:
lfold=lf[0]='\xDC'; rhold=rh[0]='\xDF'; break;
case 2:
lfold=lf[0]='\xDF'; rhold=rh[0]='\xDC'; break;
case 3:
lfold=lf[0]='\xDC'; rhold=rh[0]='\xDC'; break;
case 5:
lfold=lf[0]='\xDC'; rhold=rh[0]='\xDF'; break;
case 6:
lfold=lf[0]='\xDF'; rhold=rh[0]='\xDC'; break;
case 7:
lfold=lf[0]='\xDC';
rhold=rh[0]='\xDC';
break; }
sprintf(message,"%s%03d,%03d and Status: %s %s",str,x_cur,y_cur,lf,rh); outtextxy(x,y,message); /*显示当前光标的状态*/
while(!kbhit()) /*若键盘有击键,则退出*/
{
mregs.x.ax=3; /*读鼠标按键状态*/
int86(0x33,&mregs,&mregs);
switch(mregs.x.bx)/*检查按键状态*/
{ case 0:
lf[0]='\xDF';
rh[0]='\xDF';
break;
case 1:
lf[0]='\xDC';
rh[0]='\xDF';
break;
case 2:
lf[0]='\xDF';
rh[0]='\xDC';
break;
case 3:
lf[0]='\xDC';
rh[0]='\xDC';
break;
case 5:
lf[0]='\xDC';
rh[0]='\xDF';
break;
case 6:
lf[0]='\xDF';
rh[0]='\xDC';
break;
case 7:
lf[0]='\xDC';
rh[0]='\xDC';
break; }
if(x_cur!=mregs.x.cx||y_cur!=mregs.x.dx||lf[0]!=lfold||rh[0]!=rhold)
{ x_cur=mregs.x.cx;
y_cur=mregs.x.dx;
lfold=lf[0];
rhold=rh[0];
sprintf(message,“%s%03d,%03d and Status: %s %s",str,x_cur,y_cur,lf,rh);
clearviewport();
outtextxy(x,y,message); /*输出鼠标状态信息*/ } }
mregs.x.ax=0;/*复位光标*/
int86(0x33,&mregs,&mregs);
mregs.x.ax=2;/*隐藏光标*/
int86(0x33,&mregs,&mregs);
closegraph();/*关闭图形系统*/
return 0;
}。

相关文档
最新文档