检查鼠标点击的程序只能运行一次

时间:2016-11-28 05:54:06

标签: c++ dos turbo-c++

我在Turbo C ++中制作了这个程序,当用户点击屏幕上的方块时,程序应该退出。如果我运行一次,该程序工作正常。但是当我再次运行它时,只要鼠标在广场内,它就会退出。它不等待点击。我认为这与重置鼠标有关。

#include<process.h>
#include<conio.h>
#include<graphics.h>
#include<dos.h>
union REGS in,out;
void main()
{
int gdriver = DETECT,gmode;
int xp,yp,cl=0;
int x,y;
 initgraph(&gdriver,&gmode,"C:\\Turboc3\\BGI");
x=getmaxx()/2;
y=getmaxy()/2;
in.x.ax=4;
in.x.cx=10;
in.x.dx=10;
int86(51,&in,&out);
in.x.ax=1;
int86(51,&in,&out);
setcolor(RED);
rectangle((x-100),(y-100),x,y);
    in.x.ax=3;
while(1)
{    
 int86(51,&in,&out);
 cl=out.x.bx;
 xp=out.x.cx;
 yp=out.x.dx;
 if(((xp>=x-100)&&(xp<=x))&&((yp>=y-100)&&(yp<=y)))
  if(cl==1)
      {
       cl=0;
   exit(1);
      }
 }
}

OUTPUT

P.S。我已经知道Turbo C ++是一个古老的编译器&#34;我很清楚其他现代编译器的存在,但我被迫使用这个编译器。

2 个答案:

答案 0 :(得分:0)

好的,我已经找到了问题所在。当我再次启动程序时,不是直接在方形按钮内拖动鼠标,如果我先在方形按钮外面单击然后向方形按钮移动,则问题不会发生。 基本上,当程序第二次启动时,鼠标以click = 1而不是click = 0开始。我不知道如何解决这个问题..

答案 1 :(得分:0)

我发现了这个,如果那会对​​你有所帮助。取决于您正在运行的操作系统......或者是DosBox?它使用BGI设置图形模式,如果你从x64窗口运行它可能不起作用,应该从DosBox(至少,Turbo Pascal的版本)。奇怪的是,程序在使光标可见后执行鼠标状态的一次虚拟读取,以刷新寄存器。这是你遭遇的陷阱吗?

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

union REGS i, o;

int initmouse()
{
   i.x.ax = 0;
   int86(0X33,&i,&o);
   return ( o.x.ax );
}

void showmouseptr()
{
   i.x.ax = 1;
   int86(0X33,&i,&o);
}

void getmousepos(int *button, int *x, int *y)
{
   i.x.ax = 3;
   int86(0X33,&i,&o);

   *button = o.x.bx;
   *x = o.x.cx;
   *y = o.x.dx;
}

main()
{
   int gd = DETECT, gm, status, button, x, y;
   char array[50];

   initgraph(&gd,&gm,"C:\\TC\\BGI");
   settextstyle(DEFAULT_FONT,0,2);

   status = initmouse();

   if ( status == 0 )
      printf("Mouse support not available.\n");
   else
   {
      showmouseptr();

      getmousepos(&button,&x,&y);

      while(!kbhit())
      {
         getmousepos(&button,&x,&y);

         if( button == 1 )
         {
            button = -1;
            cleardevice();
            sprintf(array,"Left Button clicked x = %d y = %d",x,y);
            outtext(array);
         }
         else if( button == 2 )
         {
            button = -1;
            cleardevice();
            sprintf(array,"Right Button clicked x = %d y = %d",x,y);
            outtext(array);
         }

      }
   }

   getch();
   return 0;
}

你正在做我老板开玩笑地打电话的事情&#34;计算机恋尸癖&#34;。那些旧系统有各种怪癖。有些原因让老程序员在疯狂的情况下初始化变量。你可能遇到这样的问题:如果你声明一个long int变量,然后给它分配一个long值,然后是一个short值,那么在第二种情况下只会设置较低的单词 - 所有这些都是因为编译器不是&#39; t&#34;铸造&#34;从短到长隐含地,它只是将二进制图像复制到同一地址。