C/C++ 鼠标编程






1.04/5 (29投票s)
2005 年 8 月 14 日
5分钟阅读

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 |
重置鼠标并获取状态 |
51 | 1 |
显示鼠标指针 |
51 | 2 |
隐藏鼠标指针 |
51 | 3 |
获取鼠标位置和按钮状态 |
51 | 4 |
设置鼠标指针位置 |
51 | 7 |
设置指针的水平限制 |
51 | 8 |
设置指针的垂直限制 |
让我们考虑一个利用上述函数的程序。
#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