C语言课程设计鼠标控制
2013-2014学年 第二学期 学号 1308010115
《高级语言程序设计》
目: 鼠标控制
专业: 计算机科学与技术 班级: 13级(1)班
姓名:
指导教师:
成绩:
计算机与信息工程系
二0一四年六月二十日
计算机与信息工程系 《高级语言程序设计》课程设计
目录
1设计内容及要求.........................................1
1.1鼠标简介.....................................................1 1.2鼠标功能调用方法...........................................1 1.3 设计要求..................................................... 1 2设计过程或程序代码............................................1 2.1程序代码......................................................1
2.2对程序调试过程的说明......................................5 4程序运行结果.....................................................6 5小结.............................................................6 致谢...........................................................7 参考文献...........................................................7 附:源程序..........................................................7
1设计内容及要求
1.1鼠标简介
鼠标系统实际上由两个主要元素组成:鼠标机制和称作鼠标驱动程序的内存驻留程序。鼠标驱动程序提供鱼鼠标通信所需的全部低级支持。此外,它自动维持鼠标光标位置和发现是否按下了某个键。一旦装入驱动程序,鼠标就可以被随后执行的任意程序使用。可以通过PC中短33H访问鼠标和鼠标驱动程序的各种功能。所选择的特定函数依赖于中断时AX寄存器的值。三个其它寄存器(BX、CX和DX)用于把各种参数传给鼠标例程。同样,鼠标函数使用这四个寄存器把鼠标的位置和按钮的状态返回给调用函数。
1.2 鼠标功能调用方法
用TC通过INT33H中段来编制基本函数,有三种常用方法:
1. 嵌入汇编程序,如:ASM CLI清中断。
2. 利用全程变量赋予寄存器值,然后通过函数geninterrupt()调用中断
实现。
3. 利用联合类型REGS,SREGS通过函数int86(),int86x()调用中断,原
型在dos.h。
1.3设计要求
通过鼠标的初始化、鼠标光标的隐藏、鼠标光标的显示、读取鼠标的状态设置光标位置、设置鼠标光标形状、设置鼠标的移动范围编写一个简单的鼠标控制程序。
2设计过程或程序代码
2.1程序代码
鼠标的初始化
InitMouse()
{union REGS regs;
regs.x,ax=0;
int86(0x33,®s,®s);
if(regs.x.ax==0)
return false;
0
计算机与信息工程系 《高级语言程序设计》课程设计报告 elese return true;}
鼠标光标的隐藏
HideCur()
{union REGS regs;
if(visual){
regs.x.ax=2;
int86(0x33,®s,®s);
visual=false;
}}
鼠标光标的显示
ShowCur()
{union REGS regs;
if(!visual){
regs.x.ax=1;
int86(0x33,®s,®s);
visual=true;
}}
读取鼠标的状态
Status()
{union REGS regs;
regs.x.ax=3;
int86(0x33,®s,®s);
x=regs.x.cx;y=regs.x.dx;
status=regs.x.bx;
}
设置光标位置
1
计算机与信息工程系 《高级语言程序设计》课程设计报告 void MoveMouse(int x,int y) {REGS regs;
regs.x.ax=4;
regs.x.cx=x;
regs.x.dx=y;
int86(0x33,®s,®s); }
设置鼠标光标形状
SetCurs(unsigned masks[32],x,y) { union REGS regs;struct SREGS sregs;
regs.x.ax=9;
regs.x.bx=x; regs.x.cx=y;/* hotspot*/
regs.x.dx=(unsigned)masks;
segread(&stregs);
int86(0x33 ®s ®s); }
设置鼠标的移动范围
SetCurs(unsigned masks[32],x,y) { union REGS regs;struct SREGS sregs;
regs.x.ax=9;
regs.x.bx=x; regs.x.cx=y;/* hotspot*/
regs.x.dx=(unsigned)masks;
segread(&sregs);
int86(0x33 ®s ®s); }
程序实例 #include
#include
2
计算机与信息工程系 《高级语言程序设计》课程设计报告 #include
void main()
{
// 初始化图形窗口
initgraph(640, 480);
MOUSEMSG m; // 定义鼠标消息
while(true)
{
// 获取一条鼠标消息
m = GetMouseMsg();
switch(m.uMsg)
{
case WM_MOUSEMOVE:
// 鼠标移动的时候画红色的小点
putpixel(m.x, m.y, RED);
break;
case WM_LBUTTONDOWN:
// 如果点左键的同时按下了 Ctrl 键
if (m.mkCtrl)
// 画一个大方块
rectangle(m.x-10, m.y-10, m.x+10, m.y+10);
else
// 画一个小方块
rectangle(m.x-5, m.y-5, m.x+5, m.y+5);
2.2对程序调试过程的说明
3
计算机与信息工程系 《高级语言程序设计》课程设计报告
鼠标光标的显示与隐藏
在鼠标驱动程序中,鼠标的显示状态用0值表示,隐藏要负值表示,每没调用一次显示功能则该值加一,每调用一次隐藏功能,则该值减一。这样,在多次调用了驱动程序的隐藏鼠标光标功能后,再调用显示鼠标光标。需要加入一个visual布尔型变量,来取代驱动程序中是的数值。 读取鼠标的状态
其中X,Y为光标位置
status&1左键状态,1为按下,0为未按
status&2右键状态,1为按下,0为未按
status&4中键状态,1为按下,0为未按
要注意循环检测时的抖动现象,可增加一些空循环或延时来清除剩余的按键信号。
设置鼠标光标形状
设置鼠标光标需要三个方面信息:
鼠标的外边界:8*8点阵,16个整数
鼠标的内部形状:8*8点阵,16个整数
以及鼠标的热点的相对坐标:int x,y
其中外边界和内边界连续存放,为长度为32的整型数组int marks[32]
4运行结果
4
计算机与信息工程系 《高级语言程序设计》课程设计报告
5小节
在这短短几个月里,我从不是完全懂TC,到能自己编出简单的菜单模型,收获了很多很多。这几个月的平均每日要花费几个小时。一些看似简单的bug,却让没有经验的我调试很久。慢慢就体会到了,那些从事编程工作的人们的辛苦。更让我觉得那些任意盗版他人作品人的可恶。自己起早贪黑做出的程序却被他人未经授权直接拿去从事商业活动。创作人员的积极性正是在这种情况下被一点一点的擦去的。编程其实和写作很像,曾经看过《疯狂的编程员》的前几章,作者说,他从来不把编程序叫作编程序,他把那称为写程序。一字之差,却不难看出程序中包含了多少编程人员的心血。这几天,我学习的对象大多是鼠标控制的图形设计,及自己去控制菜单的进入与
5
计算机与信息工程系 《高级语言程序设计》课程设计报告
返回。像同学做的汉诺塔用到的递归知识,我只是很大略的了解。而管理系统中用到的文件操作自己却更没有去细细阅读。以后这些都会补上的。
致谢
在本次实验中,要特别感谢我的知道老师陈广宏老师和组长韦小明同学,感谢陈广宏老师对我的悉心教导,传授我一些基本的c语言理论知识,组长韦小明对我在设计过程中,积极帮我解决各种问题,指出我的错误所在,帮助我把各个方面都做好。
参考文献
[1]《C程序设计》(第二版),谭浩强编,清华大学出版社,1999年12月。 [2]《C语言程序设计习题集》(第二版),陈朔鹰陈英主编,人民邮电出版社,2003年2月。
[3]《C语言趣味程序百例精解》,陈朔鹰陈英主编,北京理工大学出版社,1996年。
[4]《C语言程序设计辅导与习题集》,田淑清等,中国铁道出版社,2000年 1月。
[5]《C语言编程常见问题解答》,[美]Paul S. R. Chishohm等著,张芳妮吕波译,清华大学出版社,1996年12月。
源程序
鼠标的初始化
InitMouse()
{union REGS regs;
regs.x,ax=0;
int86(0x33,®s,®s);
if(regs.x.ax==0)
return false;
elese return true;}
鼠标光标的隐藏
HideCur()
{union REGS regs;
if(visual){
regs.x.ax=2;
int86(0x33,®s,®s);
visual=false;
6
计算机与信息工程系 《高级语言程序设计》课程设计报告
}}
鼠标光标的显示
ShowCur()
{union REGS regs;
if(!visual){
regs.x.ax=1;
int86(0x33,®s,®s);
visual=true;
}}
读取鼠标的状态
Status()
{union REGS regs;
regs.x.ax=3;
int86(0x33,®s,®s);
x=regs.x.cx;y=regs.x.dx;
status=regs.x.bx;
}
设置光标位置
void MoveMouse(int x,int y) {REGS regs;
regs.x.ax=4;
regs.x.cx=x;
regs.x.dx=y;
int86(0x33,®s,®s); }
设置鼠标光标形状
SetCurs(unsigned masks[32],x,y) { union REGS regs;struct SREGS sregs;
regs.x.ax=9;
regs.x.bx=x; regs.x.cx=y;/* hotspot*/
regs.x.dx=(unsigned)masks;
segread(&stregs);
int86(0x33 ®s ®s); }
设置鼠标的移动范围
SetCurs(unsigned masks[32],x,y) { union REGS regs;struct SREGS sregs;
regs.x.ax=9;
regs.x.bx=x; regs.x.cx=y;/* hotspot*/
7
计算机与信息工程系 《高级语言程序设计》课程设计报告
regs.x.dx=(unsigned)masks;
segread(&sregs);
int86(0x33 ®s ®s); }
#include
#include
#include
void main()
{
// 初始化图形窗口
initgraph(640, 480);
MOUSEMSG m; // 定义鼠标消息
while(true)
{
// 获取一条鼠标消息
m = GetMouseMsg();
switch(m.uMsg)
{
case WM_MOUSEMOVE:
// 鼠标移动的时候画红色的小点
putpixel(m.x, m.y, RED);
break;
case WM_LBUTTONDOWN:
// 如果点左键的同时按下了 Ctrl 键
if (m.mkCtrl)
// 画一个大方块
rectangle(m.x-10, m.y-10, m.x+10, m.y+10);
else
// 画一个小方块
rectangle(m.x-5, m.y-5, m.x+5, m.y+5);
break;
case WM_RBUTTONUP:
return; // 按鼠标右键退出程序
}
}
// 关闭图形窗口
closegraph();
8
计算机与信息工程系 《高级语言程序设计》课程设计报告
}
9