MANEJO DEL MOUSE EN LENGUAJE C++
Bruno López Takeyas
Instituto Tecnológico de Nuevo Laredo
Reforma Sur 2007, C.P. 88250, Nuevo Laredo, Tamps. México
http://www.itnuevolaredo.edu.mx/takeyas
E-mail:
[email protected]
Registros de propósito especial: Guardan el
estado de la CPU y el apuntador de instrucciones
que indica la siguiente instrucción que ejecutará
la CPU.
Registros de Propósito
Resumen: En este artículo se examinarán
varias funciones especiales de lenguaje C++ que
permiten que los programas accedan a los
recursos de
las
funciones BIOS o DOS, haciendo especial énfasis
en las funciones de manejo del mouse.
la computadora mediante
Cada procesador, sistema operativo y entorno
tiene sus propios métodos de acceder a los
recursos del sistema. Para efectos didácticos se
asumirá el uso del sistema operativo PC-DOS y
la familia de procesadores 8086.
Palabras claves: Mouse, interrupción, registro,
lenguaje C++, encabezado.
1. Registros de la CPU
La familia de procesadores 8086 tiene 14
registros en los que se pone la información para
procesar el programa de control. Los registros
pueden ser de las categorías siguientes:
Registros de propósito general: Son de trabajo
de la CPU. En estos registros se colocan los
incluye
valores para su procesamiento que
operaciones
e
instrucciones de bifurcación o saltos.
Registros de base de puntero e índice: Se usan
para proporcionar
soporte a cosas como
direccionamiento relativo, apuntador de pila e
instrucciones para mover bloques.
Registros de segmento: Son usados para
soportar el esquema de memoria segmentada. El
registro CS guarda el segmento de código actual,
el DS el segmento actual de datos, el ES el
segmento extra y el SS el segmento de pila.
comparaciones
aritméticas,
General
AH
BH
Registros de puntero e
índice
Puntero de pila
Puntero base
Registros de segmento
Segmento de
código
AX
BX
SP
BP
CS
DS
CX
DX
SI
DI
SS
ES
CH
DH
Ïndice fuente
Índice destino
Segmento de pila
CL
DL
AL
BL
Segmento de
datos
Registro de propòsito
especial
Segmento extra
Registro de
indicadores
IP
Puntero de
instrucciones
Fig. 1. Registros de la CPU
1
2. Interrupciones
interrupción es un
Una
tipo especial de
instrucción que provoca la parada de la ejecución
del programa, guarda el estado actual del sistema
en la pila y salta a una rutina de manejo de la
interrupción que se determina por el número de la
interrupción. Después de que acabe la rutina,
realiza una vuelta a la interrupción que provoca
que se reanude
la ejecución del programa
anterior.
Hay dos tipos básicos de interrupciones: las
generales por hardware y las provocadas por
software. La CPU permite a un programa ejecutar
una interrupción software por la instrucción INT.
El número que sigue a la instrucción determina el
número de la interrupción. Por ejemplo, INT 21h
provoca la interrupción 21h.
Muchas de estas interrupciones son usadas por
el BIOS o el DOS como un medio de acceder a
diversas funciones que son parte del sistema
operativo. Cada interrupción se asocia a una
categoría de servicios a las que accede que son
determinados por el valor del registro AH. Si se
necesita información adicional se pasa en los
registros AL, BX, CX y DX.
3. Función int86()
La función int86() de Turbo C++ se usa para
ejecutar una interrupción de software. Se declara
como se muestra en la Fig. 2.
int86(int intnum, union REGS *in, union REGS *out)
Fig. 2. La función int86()
El número de la interrupción en esta función es
intnum, in es una unión que contiene los
registros que se usarán para pasar la información
a los manejadores de la interrupción y out es una
unión que guardará los valores devueltos por la
interrupción (si los hay).
struct WORDREGS {
unsigned int ax, bx, cx, dx, si, di;
unsigned int cflag, flags;
};
struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch;
unsigned char dl, dh;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
Fig. 3.- Tipo REGS incluido en el archivo de encabezado
DOS.H
Como se puede observar en la Fig. 3, REGS es
una unión de dos estructuras que contiene el
archivo de encabezado DOS.H. Usar la estructura
WORDREGS permite acceder a los registros de
la CPU como cantidades de 16 bits. El uso de
BYTEREGS da acceso a los registros de 8 bits.
4. Aplicaciones usando el
mouse
Se pueden desarrollar aplicaciones en las que se
incluya el manejo mediante el uso del mouse a
través de la INT 33h (Mouse) con sus servicios
correspondientes.
4.1. ¿Cómo invocar los servicios del Mouse?
Los servicios del Mouse se utilizan invocando
la INT 33h mediante la función int86(),
colocando los valores adecuados en los registros
según corresponda; es decir, cuando se desea
invocar un servicio particular, deben inicializarse
los registros con los valores correspondientes,
invocarse la interrupción y el resultado de dicho
servicio se coloca en los registros determinados.
Por ejemplo, el programa de la Fig. 4 inicializa
primero el mouse invocando la INT 33h con el
servicio AL=1
(inicialización del Mouse).
Contiene un ciclo que mientras no se oprima
cualquier tecla, monitorea constantemente el
status del mouse invocando la INT 33h con el
servicio AL=3, la cual devuelve en BX=1 si se
oprimió el botón izquierdo o en BX=2 si se
oprimió el botón derecho.
2
/*
Programa para usar el mouse
Instructor: M.C. Bruno Lopez Takeyas
*/
#include <dos.h> /* Encabezado con la
definicion de int86()*/
#include <conio.h>
#include <iostream.h>
void main(void)
{
union REGS regs; /* Declaracion de la
union regs de tipo REGS para el uso de
los registros de la CPU*/
clrscr();
gotoxy(1,24); cout << "Oprima
cualquier tecla para salir";
regs.h.al=0x1; /* Inicializar el
registro AL con el valor 1(hexadecimal)
es decir, invoca el servicio 1 de la INT
33h (mouse)para habilitar el Mouse*/
int86(0x33,®s,®s); /* Invoca la
INT 33h (mouse)*/
while(!kbhit()) /* Ciclo mientras NO
se oprima cualquier tecla*/
{
regs.h.al=0x3; /* Inicializar el
registro AL con el valor 3(hexadecimal)
es decir, invoca el servicio 3 de la INT
33h (mouse) para detectar el status del
mouse, o sea, si se oprime algun boton y
las coordenadas del cursor*/
int86(0x33,®s,®s); /* Invoca
la INT 33h (mouse). El servicio 3 de la
INT 33h devuelve el status del mouse en
el registro BX*/
/* Si BX=1 entonces se oprimio el boton
izquierdo*/
/* Si BX=2 entonces se oprimio el boton
derecho*/
if(regs.x.bx==1)
{
gotoxy(20,12); cout << "Boton
izquierdo";
3
gotoxy(20,12); cout << "
";
}
if(regs.x.bx==2)
{
gotoxy(40,12); cout << "Boton
derecho";
gotoxy(40,12); cout << "
";
}
}
return;
}
Fig. 4.- Servicios del mouse
la mayoría de
4.2. El encabezado LIBMOUSE.H
En
la Fig. 5 se muestra el encabezado
LIBMOUSE.h que contiene las declaraciones
necesarias y
los servicios
necesarios para utilizar el mouse en un programa.
Este encabezado está diseñado para utilizarse
tanto en el compilador TURBOC como en el
compilador QUICKC, sólo es cuestión de
especificarlo al principio mediante
línea
#define
o
#define zCOMPILER zQUICKC según
corresponda.
la
zTURBOC
zCOMPILER
/* ENCABEZADO
........................................
........ LIBMOUSE.H
.
Instituto Tecnologico de Nuevo Laredo
. */
#define zCOMPILER zTURBOC
#define zMOUSE 0x33
#include <dos.h>
#if zCOMPILER==zQUICKC
static union REGS inregs,outregs;
#elif zCOMPILER==zTURBOC
static union REGS regs;
/* PARA EL CONTENIDO DE REGISTROS*/
#endif
#ifdef SII
struct mdata /*
ESTRUCTURA DE DATOS DE MOUSE */
{
int MouseFlag;
int MouseButton;
int MouseX;
int MouseY;
int MouseMinX;
int MouseMaxX;
int MouseMinY;
int MouseMaxY;
}MouseParams;
#endif SII
void zMouseDetect(struct mdata *Mptr);
/* INICIALIZAR SI SE ENCUENTRA */
void zMouseInit(struct mdata *Mptr);
/* INICIALIZA EL DRIVER */
void zMouseShow(struct mdata *Mptr);
/* MUESTRA EL CURSOR */
void zMouseHide(struct mdata *Mptr);
/* ESCONDE EL CURSOR */
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 */
/* DECLARACION DE ALGUNAS VARIABLES :
*/
/* FUNCION DE ALTO NIVEL PARA
INICIALIZAR EL MOUSE SI ESTA PRESENTE :
*/
void zMouseDetect(struct mdata *Mptr)
{
zMouseInit(Mptr);
/* INTENTA INICIALIZAR EL MOUSE */
if(Mptr->MouseFlag==0) return;
/* ABORTAR SI NO SE ENCUENTRA */
zMouseHLimit(Mptr);
zMouseVLimit(Mptr);
zMousePos(Mptr);
}
/* PRE-INICIALIZACION DE MOUSE A BAJO
NIVEL : */
void zMouseInit(struct mdata *Mptr)
{
#if zCOMPILER
Comentarios de: Manejo del mouse en lenguaje C++ (0)
No hay comentarios