TC 2.0中实用鼠标的一个问题。

nasco 2000-07-28 08:53:00
我在用TC编写一个简单的游戏程序,其中需要判定鼠标左右的按键状态。我编写了如下函数:
void mouse_reset(void)
{
union REGS r;
r.x.ax=0;
int86(0x33,&r,&r);
if((int)r.x.ax!=-1)
{
printf("Please make sure you have installed mouse and the driver!");
exit(1);
}
}

void cursor_on(void)
{
union REGS r;
r.x.ax=1;
int86(0x33,&r,&r);
}

void cursor_off(void)
{
union REGS r;
r.x.ax=2;
int86(0x33,&r,&r);
}

int left_pressed()
{
union REGS r;
int c;
r.x.ax=3;
int86(0x33,&r,&r);
c=r.x.bx;
return c & 1;
}

int right_pressed()
{
union REGS r;
r.x.ax=3;
int86(0x33,&r,&r);
return r.x.bx & 2;
}

void mouse_position(int *x,int *y)
{
union REGS r;
r.x.ax=3;
int86(0x33,&r,&r);
*x=r.x.cx;
*y=r.x.dx;
}

其中right_pressed()和left_pressed()作为分别判断左右按键的函数,同时为了测试
我编写了一个简单的测试程序
main()
{
mouse_reset();
clrscr();
for(;;)
{
if(right_pressed())
{
printf("R");
}
if(left_pressed())
{
printf("L");
}
}
}
按照我的设想,应该是每按下一次左健或者右健输出一个"R"或者"L",但是一次会输出几百个...也就是IF语句几百次被判断成真。程序的问题出在什么地方?
大家一定帮助小弟解决这个问题,先谢过了!
:)
...全文
245 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
koalaz 2000-08-02
  • 打赏
  • 举报
回复
破服务器真慢,害我多帖了几次,不好意思。
koalaz 2000-08-01
  • 打赏
  • 举报
回复
不这样才是不对的,mouse的键被按下后,只要你还没放开,就是还按在那里,left_pressed()
的返回就一直是真的,你的循环又是一直下去的,那没有几百个'L'就是比较怪的事情了。
在Windows下,mouse的消息就是分为 WM_LBUTTONDOWN 和 WM_LBUTTONUP 的,你的程序也
应该考虑到这一点,不要认为按下一次就只有一个left_pressed()会为真(因为你按键的速度
是不可能达到程序循环速度的:)。
如果你只想打印一次'L',那只要设置一个flag记录mouse键的当前状况,再在判断只加进对此
flag的判断即可。
goodluck to you.
mxp 2000-07-28
  • 打赏
  • 举报
回复
for(;;)
{
if(right_pressed())
{
printf("R");
}
if(left_pressed())
{
printf("L");
}
}

那两个返回有问题!
Wingsun 2000-07-28
  • 打赏
  • 举报
回复
现在手头没有资料不好回答,等我回去查一查。
nasco 2000-07-28
  • 打赏
  • 举报
回复
有人知道吗?
nasco 2000-07-28
  • 打赏
  • 举报
回复
给一份!谢谢!nileib@online.sh.cn
Garfield 2000-07-28
  • 打赏
  • 举报
回复
我有源程序
nasco 2000-07-28
  • 打赏
  • 举报
回复
如何清除?望大侠指教! :)
谢谢!
Wingsun 2000-07-28
  • 打赏
  • 举报
回复
接收完成鼠标信息后要清除缓冲区,不清除的话你就总是检测到消息的存在。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧