2016-11-28 9 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

P.S.私は既にTurbo C++が「古代のコンパイラ」であり、他の現代のコンパイラの存在をよく知っていることを知っていますが、このコンパイラを使用することを余儀なくされています。

+1

ドライバをリセットします。実際は、最初はint 33hの関数0を呼び出します。完全な参照(それはまだそれです):https://courses.engr.illinois.edu/ece390/books/labmanual/io-devices-mouse.html – Swift

+0

@Swift私はin.x.ax = 0とint86を使用しました51、&in、&out)ステートメントを使用します。私はあなたが正しいことを言ったと思う?しかし、それはまだ動作しません:( –

+0

実行するOSは何ですか? – Swift

答えて

0

私は問題を把握しました。プログラムをもう一度起動すると、正方形のボタンの内側にマウスをドラッグするのではなく、最初に正方形のボタンの外側をクリックしてから正方形のボタンの方に移動すると、問題は発生しません。 基本的に、プログラムが2回目に開始されると、マウスはclick = 0ではなくclick = 1で始まります。私はこれを解決する方法を見つけることができません..

0

私はこれが何かを助けることができれば、これを発見した。お使いのOSに応じて...またはその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; 
} 

あなたは私の上司が「コンピュータの壊死」と呼んでいることをやっています。それらの古いシステムにはあらゆる種類の癖がありました。なぜ古いプログラマーが変数を初期化するのが狂っているのかという理由がありました。長整数型変数を宣言すると、long型変数を宣言した後、長い値、次に短い値、それに2番目の大文字のみが設定されるという問題に直面する可能性があります。暗黙のうちに、バイナリイメージを同じアドレスにコピーしていただけです。

関連する問題