第十讲在自己的软件中使用鼠标.docx
- 文档编号:28367177
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:27
- 大小:22.95KB
第十讲在自己的软件中使用鼠标.docx
《第十讲在自己的软件中使用鼠标.docx》由会员分享,可在线阅读,更多相关《第十讲在自己的软件中使用鼠标.docx(27页珍藏版)》请在冰豆网上搜索。
第十讲在自己的软件中使用鼠标
C语言高级程序设计讲座
第十讲在自己的软件中使用鼠标
鹏程C语言教学网站庆祝建站一周年特别企划
本文技术支持网站:
http:
//202.112.86.129
学习目标
·对鼠标进行初始化的方法
·应用鼠标来执行任务
对鼠标进行初始化
这一讲我们介绍的例程,使用的是Microsoft两键鼠标器。
在使用鼠标器之前,必须安装它的设备驱动程序,对于Microsoft鼠标,必须将下列文字码放在config.sys文件中:
device=mouse.sys
在DOS6.x中,也可以用devicehigh=mouse.sys
使驱动程序安装在保留内存中。
只有这样,程序MOUSE.COM才可以被安装。
对于该鼠标器,把下面这行语句放在AUTOEXEC.BAT文件中:
mouse
这样,设备驱动程序就被安装了。
注意,鼠标驱动程序是不可以重入的;也就是说驱动函数不能再调用其他驱动函数并返回到原先状态。
一旦加载了鼠标驱动程序,无论你何时移动鼠标或按键,就产生中断0x33。
鼠标驱动程序处理中断,设置相应的内部变量并返回。
由于只有在鼠标改变状态时才产生中断,空闲鼠标对计算机性能没有影响。
就像光标与键盘相关,游标(pointer)与鼠标相关。
鼠标的游标在图形方式下是一个箭头,文本方式下是实方块。
游标显示屏幕上当前鼠标的位置。
虽然物理地分离,但是鼠标可以被认为与屏幕相连,因为鼠标驱动程序自动地保存指示鼠标当前位置的计数。
当你移动鼠标,游标自动地按与鼠标相同的方向在屏幕上移动。
鼠标设备驱动程序的访问
鼠标设备驱动程序通过使用中断0x33访问。
它包含有35个功能,由AX寄存器中的值来选择。
尽管有些鼠标函数不需要附带参数,但有些则附带参数多达三个。
附加参数由BX、CX和DX寄存器分别指定。
在鼠标中断返回时,指定鼠标函数产生的信息返回在AX、BX、CX和DX寄存器中。
下表是使用MicrosoftMouse设备驱动程序时各寄存器的使用情况。
AX鼠标事件标志位:
0鼠标移动1左键按下2左键释放3右键按下4右键释放
5-15保留
BX按键状态位:
0左键按下1右键按下2-15保留
CXx坐标
DXy坐标
DS鼠标驱动程序数据段
鼠标中断将通过使用int86()函数执行
常用的鼠标处理方式如下:
复位与读状态
功能0复位鼠标器,它关闭光标,将鼠标游标定位在屏幕中央。
在BX中返回该鼠标的键数:
BX=2,两键鼠标:
BX=0,非两键鼠标:
如果鼠标或软件没有安装,返回时AX将为0,否则为-1。
函数Reset()定义如下:
Reset()函数
charReset()
{
unionREGSireg,oreg;
ireg.x.ax=0;
int86(0x33,&ireg,&oreg);
if(oreg.x.ax==0)
return(0);
else
return
(1);
}
第一行说明ireg,oreg两个变量为unionREGS数据类型,这样一来我们就可以通过ireg或oreg变量把参数送到寄存器或取得寄存器的值。
所要传送的值放在寄存器AX里,然后通过int86()函数调用BIOS服务程序。
复位成功返回1,否则返回0。
在鼠标应用的程序里开始执行程序时最好先调用Reset()把鼠标的状态设定为起始状态。
显示游标
功能1显示鼠标游标。
没有返回值。
Show_Mouse()函数
VoidShow_Mouse()
{
unionREGSireg;
ireg.x.ax=1;
int86(0x33,&ireg,&ireg);
}
当调用Show_Mouse()函数后就可以在屏幕上看到鼠标光标Show_Mouse()函数的用法请看以下的范例:
voidmain()
{
Reset();
……
Show_Mouse();
getch();
)
程序执行完Show_Mouse()后便可以在屏幕的中央看到鼠标光标,当移动鼠标时光标会向鼠标移动的方向移动。
只要按任意键并结束程序。
关闭游标
功能2关闭鼠标游标,没有返回值。
Hide_Mouse0函数
VoidHide_Mouse()
{
unionREGSireg;
ireg.x.ax=2;
int86(0x33,&ireg,&ireg);
}
当调用HideMouse()函数后鼠标光标就会从屏幕上消失,但是鼠标移动时光标会往鼠标移动的方向移动,只是看不见而已。
读取按键状态和游标位置
功能3在BX中返回按键状态。
水平游标位置在CX中,垂直游标位置在DX中。
在VGA高分辨率显示640~480方式下,x位置在0~639之间,而y值范围在0—479之间。
鼠标的左按键和右按键定义如下:
Left_Pressed()函数
charLeft_Pressed()
{
unionREGSireg,oreg;
ireg.x.ax=3;
int86(0x33,&ireg,&oreg);
return(oreg.x.bx&1);
)
LeftPressed()用来检测被按下的键是否为左按键,若是左按键则返回1,若不是左按键则返回0。
RightPressed()函数
charRightPressed()
{
unionREGSireg,oreg;
ireg.x.ax=3;
int86(0x33,&ireg,&oreg);
retum(oreg.x.bx&2)
}
Right_Pressed()用来检测被按下的键是否为右按键,若是右按键则返回1,若不是右按键则返回0。
由于计算机的响应速度相当快,当我们按下鼠标按键时,虽然只按下一次,但计算机会响应许多次,为解决这个问题,可照以下方法解决,请看范例:
while
(1)
{
……
if(Left_Pressed())
{
Hide_Mouse();
printf(“Leftbuttonispressed”);
Show_Mouse();
}
}
在上面的程序流程while
(1)的循环中按一次鼠标左键就输出很多次Leftbuttonispressed为改善这种情形,看下面的范例:
while
(1)
{
……
if(Left_Pressed())
{
Hide_Mouse();
printf(“Leftbuttonispressed”);
Show_Mouse();
While(Left_Pressed());
}
}
在上面的程序流程while
(1)的循环中在if语句内多加了While(Left_Pressed());语句,按一次左按键,只输出一行。
Leftbuttonispressed
只做一次输出。
是因为输出第一次后,While(Leftpressed());语句的循环体为空,清掉剩余的Left_Pressed(),清完后才回到外循环While
(1)。
Get_xy(int*x,int*y)函数
voidGet_XY(int*x,int*y)
{
ireg.x.ax=3;
int86(0x33,&ireg,&oreg);
*x=oreg.x.cx;
*y=oreg.x.dK;
}
Get_XY()函数用来读取鼠标的坐标。
只要用到鼠标的功能就会用到Get_XY()函数。
在做菜单项目选择时,必须知道按键被按下的坐标是在哪一个选项区内,并用鼠标的些标来计算菜单选项的代号。
Get_XY()函数有两个指针参数,第一个指针指向水平坐标值,第二个指针指向垂直坐示值。
功能4设定鼠标光标的坐标。
第4号功能用来设定鼠标新的坐标。
通常,在设计人机界面时,要让鼠标在点中菜单选项后,所打开的视窗中可以看到鼠标光标,以便于使用者操作。
无论当前鼠标是显示状态或隐藏状态,执行本功能后鼠标坐标会移动到特定点。
若是在显示状态则明显看到鼠标光标在移动,若是隐藏状态光标坐标还是会移到设定的坐标,但看不见。
所定义的函数如下:
voidSet_XY(intx,inty)
{
unionREGSireg;
ireg.x.ax=4;
ireg.x.cx=x;
ireg.x.dx=y;
int86(0x33,&ireg,&ireg);
}
在VGA高分辨率的情况下,X的范围是0~639,Y的范围是0~479。
应用鼠标来执行任务
以下举出一个鼠标编程在应用程序中使用例程,这是一个输入一系列机床故障诊断规则并存盘的程序,注意它的编程结构和对鼠标应用的处理。
menu.h
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/******************************************************
//16点阵汉字输出函数,供主函数及所有函数调用
//入口参数:
(X,Y):
输出点坐标.Wid:
字间距.
//Color:
字颜色.*Str:
字符串.
//******************************************************/
voidzwsc16(intx,inty,intWid,intColor,char*Str)
{
FILE*fp;
unsignedZcode,Bcode;
inti,j,k,Rec;
longLen;
charBuf[32];
fp=fopen("hzk16","rb");
while(*Str)
{
if((*Str&0x80)&&(*(Str+1)&0x80))
{
Zcode=(*Str-0xa1)&0x07f;
Bcode=(*(Str+1)-0xa1)&0x07f;
Rec=Zcode*94+Bcode;
Len=Rec*32L;
fseek(fp,Len,SEEK_SET);
fread(Buf,1,32,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(Buf[i*2+j]>>(7-k)&1)
putpixel(x+j*8+k,y+i,Color);
x=x+16+Wid;
Str+=2;
}
elseStr++;
}
fclose(fp);
}
Box(intx,inty,intl,inth){
setfillstyle(1,8);
bar(x,y,x+l,y+h);
setfillstyle(1,LIGHTGRAY);
bar(x+2,y+2,x+l-2,y+h-2);
setcolor(15);
line(x,y,x+l,y);
line(x,y,x,y+h);
line(x+1,y+1,x+l-1,y+1);
line(x+1,y+1,x+1,y+h-1);
}
ReBox(intx,inty,intl,inth){
setfillstyle(1,8);
bar(x,y,x+l,y+h);
setfillstyle(1,LIGHTGRAY);
bar(x+2,y+2,x+l-2,y+h-2);
setcolor(15);
line(x,y+h,x+l,y+h);
line(x+l,y+h,x+l,y);
line(x+1,y+h-1,x+l-1,y+h-1);
line(x+l-1,y+h-1,x+l-1,y+1);
}
CoBox(intx,inty,intl,inth,intcolor){
setfillstyle(1,8);
bar(x,y,x+l,y+h);
setfillstyle(1,color);
bar(x+2,y+2,x+l-2,y+h-2);
setcolor(15);
line(x,y,x+l,y);
line(x,y,x,y+h);
line(x+1,y+1,x+l-1,y+1);
line(x+1,y+1,x+1,y+h-1);
}
CoReBox(intx,inty,intl,inth,intcolor){
setfillstyle(1,8);
bar(x,y,x+l,y+h);
setfillstyle(1,color);
bar(x+2,y+2,x+l-2,y+h-2);
setcolor(15);
line(x,y+h,x+l,y+h);
line(x+l,y+h,x+l,y);
line(x+1,y+h-1,x+l-1,y+h-1);
line(x+l-1,y+h-1,x+l-1,y+1);
}
voidgetstr(intx,inty,char*str){
intkey;
charch;
chars[2];
inti=0;
s[1]='\0';
setfillstyle(SOLID_FILL,WHITE);
setcolor(DARKGRAY);
outtextxy(x+i*8,y,"_");
while((
key=getch())!
=13){
if((key==8)||(key==75)){
if(i>0){
i--;
bar(x+i*8,y,x+(i+2)*8-1,y+8);
outtextxy(x+i*8,y,"_");
}
}elseif(ch=(char)(key&0x00ff)){
str[i]=ch;
s[0]=ch;
bar(x+i*8,y,x+(i+1)*8-1,y+9);
setcolor(DARKGRAY);
outtextxy(x+i*8,y,s);
outtextxy(x+(i+1)*8,y,"_");
i++;
}
else{
sound(1000);
delay(100);
nosound();
}
}
str[i]='\0';
setcolor(WHITE);
outtextxy(x+i*8,y,"_");
}
mouse.h
#include
#include
charInitMs()
{/*鼠标复位*/
unionREGSInr,Outr;
Inr.x.ax=0;
int86(0x33,&Inr,&Outr);
if(Outr.x.ax==0)return0;
elsereturn1;
}
voidShowMs()
{/*显示鼠标光标*/
unionREGSInr,Outr;
Inr.x.ax=1;
int86(0x33,&Inr,&Inr);
}
voidHideMs()
{/*隐藏鼠标光标*/
unionREGSInr,Outr;
Inr.x.ax=2;
int86(0x33,&Inr,&Inr);
}
charLeftPrsd()
{/*按鼠标左键*/
unionREGSInr,Outr;
Inr.x.ax=3;
int86(0x33,&Inr,&Outr);
return(Outr.x.bx&1);
}
charRightPrsd()
{/*按鼠标右键*/
unionREGSInr,Outr;
Inr.x.ax=3;
int86(0x33,&Inr,&Outr);
return(Outr.x.bx&2);
}
voidReadMs(int*f,int*x,inty)/*f:
按键状态*/
{/*读鼠标状态*//*LEFT:
1*/
unionREGSInr,Outr;/*RIGHT:
2*/
Inr.x.ax=3;/*x:
水平坐标*/
int86(0x33,&Inr,&Outr);/*y:
垂直坐标*/
*f=Outr.x.bx;
*x=Outr.x.cx;
*y=Outr.x.dx;
}
voidSetMsXY(intx,inty)
{/*设置鼠标光标位置*/
unionREGSInr,Outr;
Inr.x.cx=x;
Inr.x.dx=y;
Inr.x.ax=4;
int86(0x33,&Inr,&Inr);
}
voidSetMsArea(intXmin,intYmin,intXmax,intYmax)
{/*设置鼠标移动范围*/
unionREGSInr,Outr;
Inr.x.ax=7;
Inr.x.cx=Xmin;
Inr.x.dx=Xmax;
int86(0x33,&Inr,&Inr);
Inr.x.ax=8;
Inr.x.cx=Ymin;
Inr.x.dx=Ymax;
int86(0x33,&Inr,&Inr);
}
voidMsHideArea(intx1,inty1,intx2,inty2)
{/*设置隐藏鼠标区域*/
unionREGSInr,Outr;
Inr.x.cx=x1;
Inr.x.dx=y1;
Inr.x.si=x2;
Inr.x.di=y2;
Inr.x.ax=0x10;
int86(0x33,&Inr,&Inr);
}
intMsInBox(intx1,inty1,intx2,inty2,intx,inty)
{/*判断鼠标是否在某一矩形区域内*/
return((x>=x1&&x<=x2&&y>=y1&&y<=y2)?
1:
0);
}
ruler.h
charfstate[8][20]={
"数控曲轴磨床",
"曲轴磨加工",
"上料定位",
"砂轮修整",
"零件加工",
"加工液压传动",
"磨削量测量",
"上料液压传动",
};
charfcode[8][5]={"f00","f11","f12",
"f21","f22","f23","f24","f25",
};
charrstate[15][26]={
"艾科斯轴进给故障",
"艾科斯轴进给电气故障",
"艾科斯轴导轨润滑故障",
"行程开关故障",
"接口板故障",
"执行继电器故障",
"行程开关故障",
"接口板故障",
"液压电磁阀故障",
"接口板光隔坏",
"接口板断线",
"接口板接触不良",
"接口板光隔坏",
"接口板断线",
"接口板接触不良",
};
charrcode[15][5]={
"R11",
"R21","R22",
"R31","R32","R33","R34","R35","R36",
"R41","R42","R43","R44","R45","R46",
};
主程序:
unit10.c
#include
#include"menu.h"
#defineHADD185
#defineLADD-95
#include"ruler.h"
#include"mouse.h"
#defineG5;
char*filename;
structRULER{
intnumber;
charresult[10];
charpremise[10];
floatprob;
};
structRULERbrul[100];
intrulsum;
voidinform()/*信息显示窗口*/
{
inti;
Box(5,22,630,260);
ReBox(10,25,620,230);
for(i=0;i<2;i++)
{Box(30+i*180,260,60,20);
}
zwsc16(35,262,5,DARKGRAY,"下一页");/*选择按钮*/
zwsc16(215,263,5,DARKGRAY,"上一页");
setcolor(DARKGRAY);
for(i=1;i<=11;i++)/*显示词条信息*/
{
outtextxy(13,33+(i-1)*20,fcode[i-1]);
zwsc16(100,28+(i-1)*20,0,DARKGRAY,fstate[i-1]);
}
}
voidview(inti,intib)/*已生成的规则信息的显示*/
{
charmids[6];
intj=0;
setfillstyle(1,WHITE);
bar(200+LADD,115+HADD,240+LADD,125+HADD);
bar(170+LADD,130+HADD,240+LADD,145+HADD);
bar(170+LADD,170+HADD,240+LADD,185+HADD);
bar(170+LADD,210+HADD,240+LADD,225+HADD);
setcolor(DARKGRAY);
if(i { itoa(brul[i].number,mids,10); outtextxy(210+LADD,115+HADD,mids); outtextxy(180+LADD,135+HADD,brul[i].premise); outtextxy(180+LADD,175+HADD,brul[i].result); sprintf(mids,"%1.3f",brul[i].prob); outtextxy(180+LADD,215+HADD,mids); } else { brul[i].number=i+1; itoa(brul[i].number,mids,10); outtextxy(210+LADD,115+HADD,mids); } Box(235,285,400,170);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十讲 在自己的软件中使用鼠标 第十 自己 软件 使用 鼠标