Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo Del Mouse en Lenguaje C++ (2004-I) PDF
Manejo Del Mouse en Lenguaje C++ (2004-I) PDF
3. Función int86()
La función int86() de Turbo C++ se usa para 4.1. ¿Cómo invocar los servicios del Mouse?
ejecutar una interrupción de software. Se declara Los servicios del Mouse se utilizan invocando
como se muestra en la Fig. 2. la INT 33h mediante la función int86(),
colocando los valores adecuados en los registros
según corresponda; es decir, cuando se desea
int86(int intnum, union REGS *in, union REGS *out) invocar un servicio particular, deben inicializarse
los registros con los valores correspondientes,
Fig. 2. La función int86()
invocarse la interrupción y el resultado de dicho
El número de la interrupción en esta función es servicio se coloca en los registros determinados.
intnum, in es una unión que contiene los Por ejemplo, el programa de la Fig. 4 inicializa
registros que se usarán para pasar la información primero el mouse invocando la INT 33h con el
a los manejadores de la interrupción y out es una servicio AL=1 (inicialización del Mouse).
unión que guardará los valores devueltos por la Contiene un ciclo que mientras no se oprima
interrupción (si los hay). cualquier tecla, monitorea constantemente el
struct WORDREGS { status del mouse invocando la INT 33h con el
unsigned int ax, bx, cx, dx, si, di; servicio AL=3, la cual devuelve en BX=1 si se
unsigned int cflag, flags; oprimió el botón izquierdo o en BX=2 si se
}; oprimió el botón derecho.
2
gotoxy(20,12); cout << "
";
/* }
Programa para usar el mouse
if(regs.x.bx==2)
Instructor: M.C. Bruno Lopez Takeyas {
*/ gotoxy(40,12); cout << "Boton
derecho";
#include <dos.h> /* Encabezado con la gotoxy(40,12); cout << "
definicion de int86()*/ ";
#include <conio.h> }
#include <iostream.h> }
return;
}
void main(void) Fig. 4.- Servicios del mouse
{
union REGS regs; /* Declaracion de la
union regs de tipo REGS para el uso de
los registros de la CPU*/
3
struct mdata /* #elif zCOMPILER==zTURBOC
ESTRUCTURA DE DATOS DE MOUSE */ regs.x.ax=0;
{ /* FUNCION #0 DEL MOUSE */
int MouseFlag; int86(zMOUSE,®s,®s);
int MouseButton; /* LLAMA LA INTERRUPCION 33 HEX */
int MouseX; Mptr->MouseFlag=regs.x.ax;
int MouseY; /* IGUALA A 0 SI NO ESTA PRESENTE*/
int MouseMinX; #endif
int MouseMaxX; return;
int MouseMinY; }
int MouseMaxY;
}MouseParams; /* FUNCION PARA MOSTRAR EL CURSOR DEL
#endif SII MOUSE : */
void zMouseShow(struct mdata *Mptr)
void zMouseDetect(struct mdata *Mptr); {
/* INICIALIZAR SI SE ENCUENTRA */ #if zCOMPILER==zQUICKC
void zMouseInit(struct mdata *Mptr); inregs.x.ax=1;
/* INICIALIZA EL DRIVER */ int86(zMOUSE,&inregs,&outregs);
void zMouseShow(struct mdata *Mptr); #elif zCOMPILER==zTURBOC
/* MUESTRA EL CURSOR */
void zMouseHide(struct mdata *Mptr); regs.x.ax=1;
/* ESCONDE EL CURSOR */ /* FUNCION #1 DEL MOUSE */
void zMousePos(struct mdata *Mptr); int86(zMOUSE,®s,®s);
/* COLOCA LAS COORDENADAS x,y */ /* LLAMA LA INTERRUPCION 33 HEX */
void zMouseInfo(struct mdata *Mptr); #endif
/* CHECA LA POSICION Y EL BOTON */ return;
void zMouseHLimit(struct mdata *Mptr); }
/* COLOCA EL RANGO HORIZONTAL */
void zMouseVLimit(struct mdata *Mptr); /* FUNCION PARA NO MOSTRAR EL CURSOR DEL
/* COLOCA EL RANGO VERTICAL */ MOUSE : */
void zMouseHide(struct mdata *Mptr)
{
/* DECLARACION DE ALGUNAS VARIABLES : #if zCOMPILER==zQUICKC
*/ inregs.x.ax=2;
int86(zMOUSE,&inregs,&outregs);
/* FUNCION DE ALTO NIVEL PARA #elif zCOMPILER==zTURBOC
INICIALIZAR EL MOUSE SI ESTA PRESENTE : regs.x.ax=2;
*/ /* FUNCION #2 DEL MOUSE */
void zMouseDetect(struct mdata *Mptr) int86(zMOUSE,®s,®s);
{ /* LLAMA LA INTERRUPCION 33 HEX */
zMouseInit(Mptr); #endif
/* INTENTA INICIALIZAR EL MOUSE */ return;
if(Mptr->MouseFlag==0) return; }
/* ABORTAR SI NO SE ENCUENTRA */
zMouseHLimit(Mptr); /* FUNCION PARA DETERMINAR LA UBICACION
zMouseVLimit(Mptr); DEL MOUSE Y EL ESTADO DE BOTONES :*/
zMousePos(Mptr); void zMouseInfo(struct mdata *Mptr)
} {
#if zCOMPILER==zQUICKC
/* PRE-INICIALIZACION DE MOUSE A BAJO inregs.x.ax=3;
NIVEL : */ int86(zMOUSE,&inregs,&outregs);
void zMouseInit(struct mdata *Mptr) Mptr->MouseButton=outregs.x.bx;
{ Mptr->MouseX=outregs.x.cx;
#if zCOMPILER==zQUICKC Mptr->MouseY=outregs.x.dx;
inregs.x.ax=0; #elif zCOMPILER==zTURBOC
int86(zMOUSE,&inregs,&outregs); regs.x.ax=3;
Mptr->MouseFlag=outregs.x.ax; /* FUNCION #3 DEL MOUSE */
4
int86(zMOUSE,®s,®s);
/* LLAMA LA INTERRUPCION 33 HEX */ /* FUNCION PARA COLOCAR EL RANGO
Mptr->MouseButton=regs.x.bx; VERTICAL MINIMO Y MAXIMO :
/* 1 (IZQUIERDO) ¢ 2 (DERECHO) */ */
Mptr->MouseX=regs.x.cx; void zMouseVLimit(struct mdata *Mptr)
/* OBTIENE LA COORDENADA EN x */ {
Mptr->MouseY=regs.x.dx; #if zCOMPILER==zQUICKC
/* OBTIENE LA COORDENADA EN y */ inregs.x.ax=8;
#endif inregs.x.cx=Mptr->MouseMinY;
return; inregs.x.dx=Mptr->MouseMaxY;
} int86(zMOUSE,&inregs,&outregs);
#elif zCOMPILER==zTURBOC
/* FUNCION PARA BORRAR LA UBICACION DEL regs.x.ax=8;
CURSOR DEL MOUSE : */ /* FUNCION #8 DEL MOUSE */
void zMousePos(struct mdata *Mptr) regs.x.cx=Mptr->MouseMinY;
{ /* COLOCA LA MINIMA COORDENADA y */
#if zCOMPILER==zQUICKC regs.x.dx=Mptr->MouseMaxY;
inregs.x.ax=4; /* COLOCA LA MAXIMA COORDENADA y */
inregs.x.cx=Mptr->MouseX; int86(zMOUSE,®s,®s);
inregs.x.dx=Mptr->MouseY; /* LLAMA LA INTERRUPCION 33 HEX */
int86(zMOUSE,&inregs,&outregs); #endif
#elif zCOMPILER==zTURBOC return;
regs.x.ax=4; }
/* FUNCION #4 DEL MOUSE */ Fig. 5.- Encabezado LIBMOUSE.H
regs.x.cx=Mptr->MouseX;
/* COLOCA LA COORDENADA EN x */
regs.x.dx=Mptr->MouseY;
/* COLOCA LA COORDENADA EN y */
int86(zMOUSE,®s,®s); 4.3. Servicios del Mouse del encabezado
/* LLAMA LA INTERRUPCION 33 HEX */ LIBMOUSE.H
#endif
Las operaciones que puede realizar y controlar
return;
} el Mouse se ejecutan invocando los servicios
correspondientes de la INT 33h, tales como la
/* FUNCION PARA COLOCAR EL RANGO detección del Mouse, su inicialización, mostrar y
HORIZONTAL MINIMO Y MAXIMO : esconder el cursor, colocar el cursor en una
*/
void zMouseHLimit(struct mdata *Mptr)
posición determinada y monitorear el estatus de
{ los botones. Dichos servicios se encuentran
codificados en el encabezado LIBMOUSE.h
#if zCOMPILER==zQUICKC que sólo basta incluirlo como mediante la
inregs.x.ax=7;
inregs.x.cx=Mptr->MouseMinX;
siguiente línea de código #include
inregs.x.dx=Mptr->MouseMaxX; “LIBMOUSE.h” para invocarse y se muestran
int86(zMOUSE,&inregs,&outregs); en la Fig. 6.
#elif zCOMPILER==zTURBOC
regs.x.ax=7;
/* FUNCION #7 DEL MOUSE */
void zMouseDetect(struct mdata *Mptr);
regs.x.cx=Mptr->MouseMinX;
/* INICIALIZAR SI SE ENCUENTRA */
/* COLOCA LA MINIMA COORDENADA x */
void zMouseInit(struct mdata *Mptr);
regs.x.dx=Mptr->MouseMaxX;
/* INICIALIZA EL DRIVER */
/* COLOCA LA MAXIMA COORDENADA x */
void zMouseShow(struct mdata *Mptr);
int86(zMOUSE,®s,®s);
/* MUESTRA EL CURSOR */
/* LLAMA LA INTERRUPCION 33 HEX */
void zMouseHide(struct mdata *Mptr);
#endif
/* ESCONDE EL CURSOR */
return;
}
5
void zMousePos(struct mdata *Mptr);
/* COLOCA LAS COORDENADAS x,y */
void zMouseInfo(struct mdata *Mptr);
/* CHECA LA POSICION Y EL BOTON */
void zMouseHLimit(struct mdata *Mptr);
/* COLOCA EL RANGO HORIZONTAL */
void zMouseVLimit(struct mdata *Mptr);
/* COLOCA EL RANGO VERTICAL */
5. CONCLUSIONES
Aunque existen muchas otras funciones de
manejo del mouse, este artículo presenta los
conceptos y funciones básicas para iniciar la
codificación de programas en C++ que permitan
utilizarlo. Aquí se muestran las operaciones
fundamentales y se presentan ejemplos
representativos, los cuales pueden obtenerse en el
sitio http://www.itnuevolaredo.edu.mx/takeyas o
bien solicitarse al autor escribiendo un correo
electrónico a takeyas@itnuevolaredo.edu.mx.
6. BIBLIOGRAFÍA
• Barkakati Nabajyoti. “The Waite Group´s.
Turbo C Bible”. Howard W. Sams & Company.
Estados Unidos. 1990.