| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 979 人关注过本帖
标题:[求助]键盘鼠标同时使用的问题?一个简单的程序
只看楼主 加入收藏
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
 问题点数:0 回复次数:9 
[求助]键盘鼠标同时使用的问题?一个简单的程序

这个程序能执行也有结果,但是按键后显示的图形必须在移动了鼠标后才能显现,请问是什么原因?高手指教
#include <stdio.h>
#include <dos.h>
#include <graphics.h>
#include <bios.h>
#include "shubiao.c"

#define fRIGHT 0x4d00
#define fLEFT 0x4b00
#define fUP 0x4800
#define fDOWN 0x5000
#define fESC 0x001b

union REGS regs;
int mx,my;
int MouseX;
int MouseY;
int funkey()
{
unsigned key;
if(bioskey(1)==0)return(0);
key=bioskey(0);
if(key<<8)
key=key&0x00ff;
return key;
}

void main()
{
int key;
int graphdriver=DETECT;
int graphmode;
initgraph(&graphdriver,&graphmode,"");
setcolor(3);
setfillstyle(1,3);
bar(0,0,639,479);
MouseSetY(0,479);
MouseSetX(0,639);
MouseSetXY(100,100);
MouseMath();
MouseOn(MouseX,MouseY);
while( (key=funkey()) != fESC)
{ switch(MouseStatus())
{
case 1:MouseOff();MouseOn(MouseX,MouseY);break;/*双键按下*/
case 2:MouseOff();setcolor(14);circle(MouseX,MouseY,50);MouseOn(MouseX,MouseY);break;/*左键按下*/
case 3:MouseOff();MouseOn(MouseX,MouseY);break;/*右键按下*/
default:break;
}
switch(key)
{
case fUP : setcolor(4);circle(30,30,10);break;
case fDOWN: setcolor(12);circle(100,100,10);break;
case fLEFT : setcolor(10);circle(200,200,10);break;
case fRIGHT : setcolor(13);circle(300,300,10);break;
}
}
}

搜索更多相关主题的帖子: 键盘 鼠标 
2007-09-17 16:50
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 

你指的图形是那switch(MouseStatus()){}里的,还是switch(key){}里.

还有一点,你的funkey()函数有一点问题.key=bioskey(0);中,bioskey(0)返回的是整型数据,
你又把一个整型数据赋给一个无符号整型数据,这时会发行数据变化.

我认为,你没有必要另外定义一个函数funkey().


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-17 17:03
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
得分:0 
我也是查的那个函数,因为以前我是直接用的bioskey(0)但是鼠标根本不动,无论那个图形,我只是想按左键的时候显示大圆,用键盘上下键的时候画小圆,叫他们互不影响,想画大的就点左键,要不就用键盘。

学编程。。。。再难也得上!!!
2007-09-17 17:09
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
这个很好实现啊.
修改一下就可以了.
while(1)
{
switch(MouseStatus())
{
case 1:MouseOff();MouseOn(MouseX,MouseY);break;/*双键按下*/
case 2:MouseOff();setcolor(14);circle(MouseX,MouseY,50);MouseOn(MouseX,MouseY);break;/*左键按下*/
case 3:MouseOff();MouseOn(MouseX,MouseY);break;/*右键按下*/
default:break;
}
if(biskey(1))
{
key=bioskey(0);
if(key==fESC) break;


switch(key)
{
case fUP : setcolor(4);circle(30,30,10);break;
case fDOWN: setcolor(12);circle(100,100,10);break;
case fLEFT : setcolor(10);circle(200,200,10);break;
case fRIGHT : setcolor(13);circle(300,300,10);break;
}
}
}

[此贴子已经被作者于2007-9-18 13:29:54编辑过]


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-17 17:17
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
得分:0 
回复:(neverTheSame)这个很好实现啊.修改一下就可以...

谢谢neverTheSame!但是你修改过的和我原来的程序都出现同样的毛病,就是:如果用了键盘小圆并不显示而等你移动鼠标他才会出现!!这个是什么毛病?另外鼠标的程序如下:是鼠标程序的问题吗?不胜感激。。。。。


#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>

/*鼠标信息宏定义*/
#define WAITING 0xff00
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define RIGHTPRESS 0xff02
#define RIGHTCLICK 0xff20
#define RIGHTDRAG 0xff2a
#define MIDDLEPRESS 0xff04
#define MIDDLECLICK 0xff40
#define MIDDLEDRAG 0xff4c
#define MOUSEMOVE 0xff08

int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;


int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];

void MouseMath()
{int i,j,jj,k;
long UpNum[16]={
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f
};
long DownNum[16]={
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
};
for(i=0;i<16;i++)
{
j=jj=15;
while(UpNum[i]!=0)
{
up[i][j]=UpNum[i]%2;
j--;
UpNum[i]/=2;
}
while(DownNum[i]!=0)
{
down[i][jj--]=DownNum[i]%2;
DownNum[i]/=2;
}
for(k=j;k>=0;k--)
up[i][k]=0;
for(k=jj;k>=0;k--)
down[i][k]=0;
for(k=0;k<16;k++)
{
if(up[i][k]==0&&down[i][k]==0)
mouse_draw[i][k]=1;
else if(up[i][k]==0&&down[i][k]==1)
mouse_draw[i][k]=2;
else if(up[i][k]==1&&down[i][k]==0)
mouse_draw[i][k]=3;
else
mouse_draw[i][k]=4;
}
}
mouse_draw[1][2]=4;
}
/*鼠标光标显示*/
void MouseOn(int x,int y)
{
int i,j;
int color;

for(i=0;i<16;i++)/*画鼠标*/
{
for(j=0;j<16;j++)
{
pixel_save[i][j]=getpixel(x+j,y+i);/*保存原来的颜色*/
if(mouse_draw[i][j]==1)
putpixel(x+j,y+i,0);
else if(mouse_draw[i][j]==2)
putpixel(x+j,y+i,15);
}
}
}
/*隐藏鼠标*/
void MouseOff()
{
int i,j,x,y,color;
x=MouseX;
y=MouseY;
for(i=0;i<16;i++)/*原位置异或消去*/
for(j=0;j<16;j++)
{
if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[i][j]);
}
}
/*鼠标是否加载
MouseExist:1=加载
0=未加载
MouseButton:鼠标按键数目 */
void MouseLoad()
{
_AX=0x00;
geninterrupt(0x33);
MouseExist=_AX;
MouseButton=_BX;
}

/*鼠标状态值初始化*/
void MouseReset()
{
_AX=0x00;
geninterrupt(0x33);
}

/*设置鼠标左右边界
lx:左边界
gx:右边界 */
void MouseSetX(int lx,int rx)
{
_CX=lx;
_DX=rx;
_AX=0x07;
geninterrupt(0x33);
}

/*设置鼠标上下边界
uy:上边界
dy:下边界 */
void MouseSetY(int uy,int dy)
{
_CX=uy;
_DX=dy;
_AX=0x08;
geninterrupt(0x33);
}

/*设置鼠标当前位置
x:横向坐标
y:纵向坐标 */
void MouseSetXY(int x,int y)
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}

/*设置鼠标速度(缺省值:vx=8,vy=1)
值越大速度越慢 */
void MouseSpeed(int vx,int vy)
{
_CX=vx;
_DX=vy;
_AX=0x0f;
geninterrupt(0x33);
}

/*获取鼠标按下键的信息*/
/*是否按下左键
返回值: 1=按下 0=释放*/
int LeftPress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}

/*是否按下中键
返回值同上 */
int MiddlePress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&4);
}

/*是否按下右键
返回值同上 */
int RightPress()
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}

/*获取鼠标当前位置*/
void MouseGetXY()
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}

int MouseStatus()/*鼠标按键情况*/
{
int x,y;
int status;
int press=0;
int i,j,color;
status=0;/*默认鼠标没有移动*/

x=MouseX;
y=MouseY;

while(x==MouseX&&y==MouseY&&status==0&&press==0)
{
if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;
}
if(status)/*移动情况才重新显示鼠标*/
{
for(i=0;i<16;i++)/*原位置异或消去*/
for(j=0;j<16;j++)
{
if(mouse_draw[i][j]==3||mouse_draw[i][j]==4)
continue;
color=getpixel(x+j,y+i);
putpixel(x+j,y+i,color^color);
putpixel(x+j,y+i,pixel_save[i][j]);
}
MouseOn(MouseX,MouseY);/*新位置显示*/
}
if(press!=0)/*有按键得情况*/
return press;
return 0;/*只移动得情况*/
}




学编程。。。。再难也得上!!!
2007-09-18 08:45
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
while(x==MouseX&&y==MouseY&&status==0&&press==0) /*status没有初始化*/
/*只有当有鼠标,或按了鼠标键,才能退出这个循环.建议去掉这个循环就可以了.*/
{
if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;
}

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-18 13:34
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
得分:0 
我想我是太笨了,去了那些还是那样!!晕死了。。。不过还是谢谢你了。。。

学编程。。。。再难也得上!!!
2007-09-18 15:52
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
得分:0 

学编程。。。。再难也得上!!!
2007-09-18 16:17
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
while(x==MouseX&&y==MouseY&&status==0&&press==0)
{
if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;
}

改成:


if(LeftPress()&&RightPress())
press=1;
else if(LeftPress())
press=2;
else if(RightPress())
press=3;
MouseGetXY();
if(MouseX!=x||MouseY!=y)
status=1;

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-18 20:05
yuerhb
Rank: 1
等 级:新手上路
威 望:1
帖 子:241
专家分:0
注 册:2007-6-1
收藏
得分:0 
谢谢neverTheSame!谢谢你那么耐心的讲解,我知道是怎么回事了,原本改了就对了,但我没保存对目录,弄了半天还是用的原来的文件,现在OK了!!多谢你啊!!!

学编程。。。。再难也得上!!!
2007-09-19 09:01
快速回复:[求助]键盘鼠标同时使用的问题?一个简单的程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013895 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved