sábado, 26 de junio de 2010

Control de interrupciones del ratón (DOS)

Desvirgo mi nuevo blog. Aquí podrás encontrar de todo, pero sobretodo información sobre programación, noticias, mis propios ensayos, etc.

También cuentas con un panel que muestra las últimas noticias de Google Noticias.

Dicho esto, empezamos:



Este ejemplo se desarrolla con Borland C++ 3.1 (Bajo Windows XP) Podemos manejar las interrupciones del ratón gracias a la interrupción 33h.

Tenemos un programa en modo gráfico bajo C (Utilizando graphics.c) y deseamos programar un botón, que al ser pulsado con el botón izquierdo de nuestro ratón, el programa ejecute una acción.

Tras programar la parte visual, y tras tener dibujado nuestro botón llegamos a programar la interrupción.

Lo primero que debemos hacer es pasar la función al registro AX. Una vez hecho, interrumpimos y 'preguntamos' por los valores registrados en BX, CX,...

Si hacemos esto dentro de una función, nos podrá devolver si se ha hecho click o no.

Antes de empezar a usar el ratón tenemos que inicializarlo. Podemos escribir un procedimiento similar a este:

void iniciarRaton()
{
union REGS registro_e, registro_s;
registro_e.x.ax =0; //Función 00h
int86 (0x33, &registro_e, &registro_s);
}



Cuando llamemos a este procedimiento, reiniciaremos el ratón. Para mas inri, podemos transformar el procedimiento en función, haciendo que devuelva 0 o 1 dependiendo de si se ha podido reiniciar el ratón o no.

También indicar que en vez de declarar union REGS dentro de cada procedimiento o función, es mas cómodo declararlo fuera de todas las funciones, haciendo que sea común a todas.

Función para los botones del ratón:

int movRat()
{ //Suponemos que union REGS es común
registro_e.x.ax =3;
int86 (0x33, &registro_e, &registro_s);
if (registro_s.x.bx ==1) return 1;
if (registro_s.x.bx ==2) return 2;
}



Esta función nos devuelve 1 si se pulsa el botón izquierdo del ratón en cualquier posición de la pantalla, y 2 para el botón derecho.

Si queremos delimitar la zona de actuación de la interrupción, la tenemos que pasar las coordenadas del botón a CX y DX (X y R, respectivamente)

Con esto, solo nos quedaría hacer una comprobación a la función movRat, para comprobar si se ha producido una interrupción.

if (movRat()==1) fprintf(stdout, "Botón Izquierdo\n");

No hay comentarios:

Publicar un comentario