2016-11-28 61 views
-1

我已經在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

附:我已經知道Turbo C++是一個「古老的編譯器」,我很清楚其他現代編譯器的存在,但我不得不使用這個編譯器。

+1

重置驅動程序,的確,首先調用int 33h的函數0。全參考(omg,它仍然在):https://courses.engr.illinois.edu/ece390/books/labmanual/io-devices-mouse.html – Swift

+0

@Swift我用in.x.ax = 0和int86( 51,&in,&out)在我的程序中的聲明。我認爲那就是你說的對的?但它仍然無法工作:( –

+0

你運行的操作系統是什麼? – Swift

回答

0

好吧,我已經找到了問題。當我再次啓動程序時,不要直接在方形按鈕內拖動鼠標,如果我先點擊方形按鈕外部,然後再向方形按鈕移動,則問題不會發生。 基本上,當程序第二次啓動時,鼠標以click = 1而不是click = 0開始。我不知道如何解決這個雖然..

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; 
} 

你正在做我老闆開玩笑地稱之爲「計算機癖」的東西。那些舊系統有各種各樣的怪癖。有原因的程序員爲什麼會瘋狂地初始化變量。你可能會遇到這樣的問題,如果你聲明一個長整型變量,然後給它分配一個長整型值,那麼一個短整型值將被設置成第二種情況 - 這是因爲編譯器不是「鑄造」短到長含蓄地說,它只是將二進制圖像複製到相同的地址。

相關問題