Progtwig de ratón en Turbo CPP

He escrito un progtwig en turbo cpp, que usa el mouse para una GUI básica. También he escrito una función que determina si se ha hecho clic con el mouse en un texto determinado que se muestra en una posición determinada. Todo funciona bien en la primera carrera. Pero cuando ejecuto el progtwig, una segunda vez surge un problema. Incluso cuando el mouse acaba de pasar sobre una opción (no hacer clic), se selecciona y se muestra la página siguiente. Gracias de nuevo por los que responden. También estoy adjuntando el código para las funciones del mouse.

union REGS in,out; int callmouse() { in.x.ax=1; int86(51,&in,&out); return 1; } void mouseposi(int &xpos,int &ypos,int &click) { in.x.ax=3; int86(51,&in,&out); click=out.x.bx; //CLICK ==1,IF LEFT BUTTON PRESSED xpos=out.x.cx; //CLICK ==2,IF RIGHT BUTTON PRESSED ypos=out.x.dx; } int mousehide() { in.x.ax=2; int86(51,&in,&out); return 1; } void setposi(int xpos,int ypos) { in.x.ax=4; in.x.cx=xpos; in.x.dx=ypos; int86(51,&in,&out); } void restrictmouseptr(int x1,int y1,int x2,int y2) { in.x.ax=7; in.x.cx=x1; in.x.dx=x2; int86(51,&in,&out); in.x.ax=8; in.x.cx=y1; in.x.dx=y2; int86(51,&in,&out); } int mouseclick(int x_org,int y_org,char str[], int x_cur, int y_cur, int cl) { static int flag=0; int y_diff=y_cur-y_org; int x_diff=x_cur-x_org; if((y_diff>=0 && y_diff=0 && x_diff<=textwidth(str))) { if(flag==0) { int oldcolor=getcolor(); setcolor(15); outtextxy(x_org,y_org,str); setcolor(oldcolor); flag=1; } if(cl!=1) return 0; //RETURNS 0 IF LEFT BUTTON IS NOT PRESSED else { mousehide(); return 1; //RETURNS 1 IF X AND Y COORDINATES ARE //WITHIN THEIR EXTREMITIES. } } else if(flag==1); { setcolor(11); flag=0; outtextxy(x_org,y_org,str); return 0; } } 

No veo la architecture de tu progtwig porque falta lo importante. Espero que tenga una lista de objetos por página con sus posiciones, tamaño, tags, color, etc. en forma de algunos arreglos de struct y ciclo para la representación de la cabina y el manejo del mouse. Algo como esto

  • ¿Alguien sabe de un ejemplo de bajo nivel (sin marcos) de una lista que se pueda arrastrar y soltar y que se pueda reordenar?

simplemente ignora las cosas VCL TCanvas,Graphics::TBitmap así que ignora las líneas que comienzan con bmp-> o scr-> (o scr-> en tus gráficos).

No estoy seguro de si ayuda, pero acabo de cavar mi antiguo juego de barrido de minas con solucionador parcial usando el mouse en Turbo C ++ . Se parece a esto:

barrido de minas

Aquí la fuente de Turbo C ++ para ello:

 //=========================================================================== //=== Includes: ============================================================= //=========================================================================== #include  //=========================================================================== //=== Types: ================================================================ //=========================================================================== typedef unsigned char byte; typedef unsigned int word; typedef unsigned long dword; //=========================================================================== //=== Headers: ============================================================== //=========================================================================== void initscr(); // 320*200*256, BW palette void clrscr(); // clear scr void rfsscr(); // vga << scr void box(word x,word y,word a); // draw box a <0..cfree> at x,y void boardint(); // init mines, clear board map void boardprn(); // draw board map void mouseint(); // init mouse void mousetst(); // test mouse (x,y,buttons) void numprn(word x,word y,word n); // write number n <0..9999> at x,y void boardtst0(int x,int y,int &n); // sub test count number of mines around void boardtst(int x,int y); // test number of mines around if error then boardend; void boardend(); // game over (lose) void boardwin(); // game over (win) int boardopt0(int x,int y); void boardopt1(int x,int y,int &c); int boardopt2(int x,int y); void boardopt3(int x,int y,int &c); void boardopt(); // optimized search //=========================================================================== //=== Global data: ========================================================== //=========================================================================== const c0=25; // used colors const c1=30; const c2=20; const c3=40; const c4=34; const c5=35; const c6=5; const cfree=13; const boardx=30; // board size const boardy=16; const minesn=99; // number of mines const boardx0=(320-(10*boardx))/2; const boardy0=(190-(10*boardy))/2+10; byte board[32][20]; byte mines[32][20]; word far *pit; long xtime0,xtime; int flags; word scrseg,scrofs; word mousex=0,mousey=0, mousel=0,mouser=0, mousel0=0,mouser0=0, mousebx=255,mouseby=255; byte far scr[64000],*vga; // 320x200x8bpp backbuffer and VGA screen byte far mouset[10][10]= // mouse cursor { 1,1,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0, 1,1,1,1,1,1,0,0,0,0, 1,1,1,1,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0, 1,0,0,1,1,0,0,0,0,0, 1,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0 }; byte far txr[14*100]= // board tiles { c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c5,c5,c0,c0,c0,c2, c1,c0,c0,c5,c0,c0,c5,c0,c0,c2, c1,c0,c0,c5,c0,c0,c5,c0,c0,c2, c1,c0,c0,c5,c0,c0,c5,c0,c0,c2, c1,c0,c0,c5,c0,c0,c5,c0,c0,c2, c1,c0,c0,c0,c5,c5,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c3,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c3,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c4,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c3,c0,c0,c2, c1,c0,c0,c4,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c0,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c0,c3,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c3,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c3,c0,c0,c2, c1,c0,c0,c3,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c3,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c4,c0,c0,c2, c1,c0,c0,c3,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c3,c3,c3,c3,c0,c0,c2, c1,c0,c0,c0,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c3,c0,c0,c0,c2, c1,c0,c0,c0,c3,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c3,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c3,c0,c0,c2, c1,c0,c0,c0,c0,c0,c3,c0,c0,c2, c1,c0,c0,c4,c0,c0,c3,c0,c0,c2, c1,c0,c0,c0,c3,c3,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c6,c6,c0,c0,c0,c0,c2, c1,c0,c0,c6,c6,c6,c6,c0,c0,c2, c1,c0,c0,c6,c6,c6,c6,c0,c0,c2, c1,c0,c0,c6,c0,c6,c6,c0,c0,c2, c1,c0,c0,c6,c0,c0,c0,c0,c0,c2, c1,c0,c0,c6,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c6,c6,c0,c0,c0,c2, c1,c0,c0,c6,c6,c6,c6,c0,c0,c2, c1,c0,c0,c6,c6,c6,c6,c0,c0,c2, c1,c0,c0,c0,c6,c6,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c6,c0,c0,c0,c0,c6,c0,c2, c1,c0,c0,c6,c0,c0,c6,c0,c0,c2, c1,c0,c0,c0,c6,c6,c0,c0,c0,c2, c1,c0,c0,c0,c6,c6,c0,c0,c0,c2, c1,c0,c0,c6,c0,c0,c6,c0,c0,c2, c1,c0,c6,c0,c0,c0,c0,c6,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2, c2,c1,c1,c1,c1,c1,c1,c1,c1,c1, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c0,c0,c0,c0,c0,c0,c0,c0,c2, c1,c2,c2,c2,c2,c2,c2,c2,c2,c2 }; //=========================================================================== //=== Subroutines: ========================================================== //=========================================================================== void initscr() { dword h,l; int i; vga=(byte far*)0x0A0000000; h=(unsigned long)scr; l=h; l=l & 65535; h=h >> 16; scrseg=h; scrofs=l; asm { mov ax,0x0013 int 0x10 } for (i=0;i<256;i++) // set color palette to grayscale asm { mov dx,0x03C8 mov ax,i out dx,al mov dx,0x03C9 mov ax,i out dx,al out dx,al out dx,al } } //=========================================================================== void clrscr() { asm { pusha push es mov di,scrofs mov es,scrseg mov ax,0x1313 mov cx,32000 rep stosw pop es popa } } //=========================================================================== void rfsscr() { asm { pusha push ds push es mov di,0 mov si,scrofs mov ds,scrseg mov ax,0xA000 mov es,ax mov cx,32000 rep movsw pop es pop ds popa } } //=========================================================================== void box(word x,word y,word a) { word b; a=a*100; b=x+320*y; for (y=0;y<10;y++) { for (x=0;x<10;x++) scr[b+x]=txr[a+x]; b+=320; a+=10; } } //=========================================================================== void boardint() { word i,x,y; for (y=0;y9999) xtime=9999; numprn(260,0,xtime); numprn( 20,0,flags); // flags } //=========================================================================== void mouseint() { mousex=0; mousey=0; mousel=0; mouser=0; asm { pusha push ds push es mov ax,0 // reset mouse int 0x33 mov cx,0 // set range mov dx,319 mov ax,7 int 0x33 mov cx,0 mov dx,199 mov ax,8 int 0x33 mov cx,mousex // set pos. mov dx,mousey mov ax,4 int 0x33 pop es pop ds popa } mousetst(); } //=========================================================================== void mousetst() { int b,x,y; asm { mov ax,3 // in mouse status test int 0x33 mov mousex,cx mov mousey,dx and bx,3 mov b,bx } mousel0=mousel; mouser0=mouser; mousel=b&1; mouser=(b&2)>>1; for (y=0;y<10;y++) for (x=0;x<10;x++) { if (mouset[y][x]) if (x+mousex<320) if (y+mousey<200) scr[(x+mousex)+320*(y+mousey)]=63; } mousebx=255; x=mousex-boardx0; mouseby=255; y=mousey-boardy0; if (x>=0) if (x1) if (x%10<9) mousebx=x/10; if (y>=0) if (y1) if (y%10<9) mouseby=y/10; } //=========================================================================== void numprn(word x,word y,word n) { int i,c; x+=3*10; c=10; for (i=0;i<4;i++) { box(x,y,n%c); n=(n-(n%c))/c; x-=10; } } //=========================================================================== void boardtst0(int x,int y,int &n) { if (x>=0) if (x=0) if (y=0) if (x=0) if (y=0) if (x=0) if (y=0) if (x=0) if (y=0) if (x=0) if (y=0) if (x=0) if (y 

Lo siento, no está muy comentado. El botón izquierdo del mouse se desplaza y el botón derecho del mouse agrega una bandera (esperando bomba). Si necesita ayuda para comprender la parte VGA gfx, consulte:

  • Mostrar una gama de colores en C

Si miras la pantalla main , verás que tengo un bucle "infinito" que vuelve a dibujar la pantalla y maneja los eventos del mouse + la lógica del juego. Supongo que deberías tener algo similar. La diferencia es que mis objetos están en la cuadrícula, por lo que la selección se realiza simplemente escalando / desplazando la posición del mouse.

En su caso, debe tener una lista de objetos y debe recorrerlos y encontrar el más cercano al mouse y no demasiado lejos ... de manera similar, como en el enlace de ejemplo Arrastrar y soltar en la parte superior de Respuesta.

También aquí otro QA relacionado:

  • entendiendo la progtwigción del buscaminas p. problema