我在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);
}
}
}
P.S。我已经知道Turbo C ++是一个古老的编译器&#34;我很清楚其他现代编译器的存在,但我被迫使用这个编译器。
答案 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;从短到长隐含地,它只是将二进制图像复制到同一地址。