找回密码
 注册

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

快捷导航
事务所专题-柯南20周年纪念事件簿
搜索
查看: 417|回复: 0

鼠标趣味编程一例

[复制链接]

杯户中学生

发表于 2004-3-17 16:22:54 | 显示全部楼层 |阅读模式
在用户自己的图形环境下应用鼠标,不但使软件界面非常友好、便于操作,而且也是一件非常有

趣的事情。

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

有的鼠标驱动程序,通过 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;

   }
您需要登录后才可以回帖 登录 | 注册 新浪微博登陆

本版积分规则

Archiver|手机版|小黑屋|名侦探柯南事务所 ( 沪ICP备05038770号 )

GMT+8, 2025-2-2 13:45 , Processed in 0.053332 second(s), 15 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表