MANEJO DEL RATÓN
12.1. UTILIZANDO INT 0X33 (SÓLO PARA MS-DOS)
El ratón puede ser inicializado y utilizado utilizado la int 0x33, esta provee todas las funciones necesarias, pero es necesario, a partir de ellas, generar nuevos procedimientos para hacer más simple el manejo y la programación posterior.
Para trabajar con el ratón debemos inicializar el modo gráfico, este permite generar el cursor de ratón tradicional (flecha), sin embargo, también es posible modificarlo y/o hacerlo desaparecer, aparecer en el el momento que se desee.
La tablas 12.1 y 12.2 contienen la funciones de la int 0x33 para el manejo del ratón. Las funciones deben ser pasadas en el registro AH.
Función Descripción Parámetros
0x00 Comprueba si el ratón está instalado Salida:
AX = 0, si no está instalado -1, si está instalado BX = # de botones
0x01 Aperece el cursor del ratón 0x02 Esconde cursor
0x03 Estado de los botones y posición del cursor
Salida: BX = Estado
Bit 0 : Botón izq. Bit 1 : Botón der. 0: Liberado
1: Pulsado CX = Posición X DX = Posición Y
0x04 Posiciona el cursor Entrada:
CX = Posición X DX = Posición Y 0x05 Estado de los pulsadores y número de
veces que han sido pulsados desde la última llamada a esta función.
Entrada:
BX = Botón comprobado 0: Izq.
1: Der. Salida:
AX = Estado de los botones BX = Número de pulsaciones CX = Posición X
DX = Posición Y
Desde la última vez que se pulsó.
Función Descripción Parámetros 0x06 IDEM para la liberación de los botones
0x07 Límite de desplazamiento horizontal del cursor
Entrada:
CX = Columna Izq. DX = Columna Der. 0x08 Límite de desplazamiento vertical del
cursor
Entrada:
CX = Línea Inferior DX = Línea Superior 0x09 Define la forma, color y punto central
del cursor, sólo se aplica en modo gráfico.
Entrada:
BX = Posición X CX = Posición Y
Del centro del cursor ES:DX = Dirección de la máscara de la pantalla y del cursor.
Tabla 12.2. (Continuación) Funciones de la int 0x33 para manejo de ratón.
La máscara de pantalla y del cursor permite crear un cursor de acuerdo a los requerimientos del usuario, cada una de las máscaras corresponde a un cursor mapeado en 16x16 bit.
Ej 12.1. Programa simple para manejo de ratón. #include <stdio.h>
#include <conio.h> #include <graphics.h> #include <dos.h>
union REGS rent, rsal; int maxx,maxy;
void main(void) {
int gdriver = VGA, gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); setcolor(LIGHTBLUE);
rectangle(0, 0,maxx= getmaxx(),maxy= getmaxy());
rent.x.ax=0x00; /* Inicializa raton con cursor por defecto */ int86(0x33,&rent,&rsal);
rent.x.ax=0x01; /* Aparece cursor por defecto */ int86(0x33,&rent,&rsal);
rent.x.ax=0x04; /* Posiciona el cursor al centro */ rent.x.cx=maxx/2;
rent.x.dx= maxy / 2; int86(0x33,&rent,&rsal);
rent.x.ax=0x07; /* Limite horizontal */ rent.x.cx=0;
rent.x.dx= maxx-200; int86(0x33,&rent,&rsal);
rent.x.ax=0x08; /* Limite vertical */ rent.x.cx=0; rent.x.dx= maxy-100; int86(0x33,&rent,&rsal); getch(); closegraph(); }
Para realizar un manejo un poco más elaborado es conveniente generar nuevas funciones que puedan er más fáciles de usar, evidentemente estas funciones deben contener el llamado a la int 0x33.
Ej 12.2. Manejo de ratón usando funciones para chequeo de estado del botón izquierdo.
Se ha creado nuevas rutinas para manejar el ratón usando la int 0x33, el programa inicializa el ratón para trabajar en un área limitada, luego sensa si ha sido presionado el botón izquierdo, a la vez va obteniendo las coordenadas del ratón. Estas coordenadas se usan para determinar si en ese momento la pulsación fue hecha sobre determinada zona. Para este ejemplo, verifica si el ratón fue pulsado sobre el área definida por el rectangulo verde.
#include <stdio.h> #include <conio.h> #include <graphics.h> #include <dos.h>
union REGS rent, rsal; int maxx,maxy; struct area { int xi; int yi; int xf; int yf; } area_salida={10,80,100,100};
/* Declaracion de rutinas para manejo de raton */
void inimouse(void); void nmouse(void);
void mousexy(int x, int y);
void limouse(int xi, int yi, int xf, int yf); void check_click_izq(int *x, int *y);
void main(void) {
int gdriver = VGA, gmode=VGAHI; int xmouse, ymouse,st_sal=0;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); setcolor(LIGHTBLUE);
rectangle(0, 0,maxx= getmaxx(),maxy= getmaxy()); setcolor(GREEN); rectangle(10,80,100,100); outtextxy(20,90,"AREA SAL"); inimouse(); limouse(10,10,100,100); while(!st_sal) { check_click_izq(&xmouse, &ymouse); st_sal=check_area(xmouse,ymouse, area_salida); } closegraph(); } void inimouse(void) {
rent.x.ax=0x00; /* Inicializa raton con cursor por defecto */ int86(0x33,&rent,&rsal);
rent.x.ax=0x01; /* Aparece cursor por defecto */ int86(0x33,&rent,&rsal);
}
void nmouse(void) {
rent.x.ax=0x02; /* Esconde cursor */ int86(0x33,&rent,&rsal);
}
void mousexy(int x, int y) {
rent.x.ax=0x04; /* Posiciona el cursor en (x,y) */ rent.x.cx= y;
rent.x.dx= x;
int86(0x33,&rent,&rsal); }
void limouse(int xi, int yi, int xf, int yf) {
/* yi<yf e xi<xf */
rent.x.ax=0x07; /* Limite horizontal */ rent.x.cx=xi;
rent.x.dx= xf;
int86(0x33,&rent,&rsal);
rent.x.ax=0x08; /* Limite vertical */ rent.x.cx=yi;
rent.x.dx= yf;
int86(0x33,&rent,&rsal); }
void check_click_izq(int *x, int *y) { do { rent.x.ax=3;rent.x.bx=0; int86(0x33,&rent,&rsal);
*x=rsal.x.cx; /* Retorna por referencia x e y */ *y=rsal.x.dx;
} while(rsal.x.bx!=1); }
int check_area(int xm,int ym,struct area areasal) { if((xm>areasal.xi)&&(xm<areasal.xf) &&(ym>areasal.yi)&&(ym<areasal.yf)) { return(1); } else return(0); }