65.9K
CodeProject 正在变化。 阅读更多。
Home

C/C++ 鼠标编程

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.04/5 (29投票s)

2005 年 8 月 14 日

5分钟阅读

viewsIcon

245098

本文描述了如何使用 C/C++ 编程来控制鼠标。它包含以下信息:1] 调用鼠标 2] 隐藏鼠标 3] 设置鼠标位置 4] 限制鼠标位置。

引言

       
              鼠标可以在文本模式和图形模式下使用。通常它用于图形模式。因此,我们必须首先切换到图形模式。在我们的程序中,initgraph() 函数负责将模式从文本切换到图形。DETECT 是 'graphics.h' 中定义的一个宏。它要求 initgraph() 自动确定要加载哪个图形驱动程序,以便切换到最高分辨率的图形模式。initgraph() 函数接受三个参数:图形驱动程序、图形模式和驱动程序文件的路径。

           驱动程序加载后,initgraph() 分别在变量 gd 和 gm 中设置所选图形模式的数值。这里我们假设驱动程序文件位于 'c:\tc\bgi' 目录中。因此,传递给 initgraph() 的路径是 'c:\tc\bgi'。

            可以通过将 AX 寄存器设置为不同的值(服务号)并发出中断号 51 来访问各种鼠标函数。函数列在下面:

中断 Service 目的
51
 
0
 

 重置鼠标并获取状态
 调用时 AX = 0
 返回:  AX = FFFFh 如果鼠标支持可用
               AX = 0 如果鼠标支持不可用 

51 1

 显示鼠标指针
 调用时 AX = 1 
 返回:无

51 2

 隐藏鼠标指针
 调用时 AX = 2
 返回:无

51 3

 获取鼠标位置和按钮状态
 调用时 AX = 3
 返回:BX = 鼠标按钮状态
 位   含义
 0     按钮未按下
 1     按下了左按钮
 2     按下了右按钮
 3     按下了中间按钮      
 CX = x 坐标
 DX = y 坐标

51 4

 设置鼠标指针位置 
 调用时 AX = 4
 CX = x 坐标
 DX = y 坐标
 返回:无

51 7

 设置指针的水平限制
 调用时 AX = 7
 CX = 最小 x 坐标
 DX = 最大 x 坐标
 返回:无

51 8

 设置指针的垂直限制
 调用时 AX = 8
 CX = 最小 y 坐标
 DX = 最大 y 坐标
 返回:无

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

            让我们考虑一个利用上述函数的程序。


       #include<graphics.h>
       #include<stdio.h>
       #include<conio.h>
       #include<dos.h>
       union REGS in,out;

       int callmouse()
       {
              in.x.ax=1;
              int86(51,&in,&out);
              return 1;
       }
       void mouseposi(int &xpos,int &ypos,int &click)
       {
              in.x.ax=3;
              int86(51,&in,&out);
              click=out.x.bx;
              xpos=out.x.cx;
              ypos=out.x.dx;
        }
       int mousehide()
       {
              in.x.ax=2;
              int86(51,&in,&out);
              return 1;
       }
      void setposi(int &xpos,int &ypos)
      {
             in.x.ax=4;
             in.x.cx=xpos;
             in.x.dx=ypos;
             int86(51,&in,&out);
      }
     int main()
      {
             int x,y,cl,a,b;
             clrscr();
             int g=DETECT,m;
             initgraph(&g,&m,"c:\tc\bgi");
             a=100;
             b=400;
             setposi(a,b);
             callmouse();
             do
             {
                    mouseposi(x,y,cl);
                    gotoxy(10,9);
                    printf("\n\t鼠标位置: %d,%d",x,y);
                    printf("\n\t点击: %d",cl);
                    printf("\n\t按任意键隐藏鼠标");
             }while(!kbhit());
             getch();
             mousehide();
             printf("\n\n\t按任意键退出");
             getch();
     }

 

 上面的程序利用了以下函数:

  • callmouse( )

  • mouseposi( )

  • mousehide( )

  • setposi( )

     callmouse()  :-  在此函数中,AX 被设置为 "1"。当在 main() 中调用此函数时,它会显示鼠标指针。可以通过移动鼠标来改变指针的位置。

     mousehide() :-  在此函数中,AX 被设置为 "2"。当在 main() 中调用此函数时,它会隐藏鼠标指针。此函数在绘制图形时非常有用,首先隐藏鼠标指针,然后绘制图形,最后再次调用鼠标指针。

     mouseposi() :-  在此函数中,AX 被设置为 "3"。此函数返回鼠标指针的位置。它包含三个参数:xpos、ypos、click。xpos 和 ypos 分别返回 x 坐标和 y 坐标的位置。Click 是一个整数变量,它返回 1、2、3 分别对应鼠标上按下的按钮,0 表示按钮未按下。
 

注意:while 循环

kbhit:如果按下任何键,kbhit 返回非零整数;否则返回零。

      setposi():-      在此函数中,AX 被设置为 "4"。此函数将鼠标指针设置到特定位置。CX 被加载为鼠标指针的 x 坐标,DX 被加载为鼠标指针的 y 坐标。

    让我们考虑另一个程序


         #include<graphics.h>
         #include<stdio.h>
         #include<conio.h>
         #include<dos.h>
         union REGS in,out;

         int callmouse()
          {
                 in.x.ax=1;
                 int86(51,&in,&out);
                 return 1;
          }
         void restrictmouseptr(int x1,int y1,int x2,int y2)
          {
                 in.x.ax=7;
                 in.x.cx=x1;
                 in.x.dx=x2;
                 int86(51,&in,&out);
                 in.x.ax=8;
                 in.x.cx=y1;
                 in.x.dx=y2;
                 int86(51,&in,&out);
          }
         int main()
          {
                 int x,y,cl,a,b;
                 clrscr();
                 int g=DETECT,m;
                 initgraph(&g,&m,"c:\tc\bgi");
                 rectangle(100,100,550,400);
                 callmouse();
                 restrictmouseptr(100,100,550,400);
                 getch();
          }

            上面的程序利用了以下函数:

  • Horizontal ( )

  • Vertical( )

      Horizontal() :- 在此函数中,AX 被设置为 "7"。它为主指针设置水平边界,限制鼠标指针超出该限制。CX 被加载为最小 x 坐标,Dx 被加载为最大 x 坐标。

     Vertical():-     在此函数中,AX 被设置为 "8"。它为主指针设置垂直边界,限制鼠标指针超出该限制。CX 被加载为最小 y 坐标,Dx 被加载为最大 y 坐标。

               更多程序请访问我的网站 http://electroguys.com

© . All rights reserved.