First commit 28/06/1997
This commit is contained in:
339
SMOUSE.CPP
Normal file
339
SMOUSE.CPP
Normal file
@ -0,0 +1,339 @@
|
||||
// Demostraci<63>n del uso del RATON en SVGA
|
||||
// Jos<6F> David Guill<6C>n
|
||||
//
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20>FuTuRe<52>ViSiOn<4F>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
||||
//
|
||||
//
|
||||
//
|
||||
// Como este fuente esta entero lleno de COMENTARIOS en el SM2.CPP, he
|
||||
// metido solo el c<>digo, si comentarios.
|
||||
|
||||
// Una de las ventajas de tener de este modo de usar el raton
|
||||
// es que nuestro puntero tiene las dimensiones que nosotros
|
||||
// deseemos, y no estamos limitados a 16x16.
|
||||
|
||||
// Crearse un puntero de raton es algo un poco pesado.
|
||||
// Lo mejor es mediante un programa de dibujo crearse el puntero
|
||||
// y luego cogerlo del dibujo directamente. ( Yo lo hago con .PCX's )
|
||||
|
||||
// Un truquito para dibujar el Puntero del RATON:
|
||||
// 1<> Lo dibujas con caracteres Semi-Gr<47>ficos
|
||||
// 2<> Lo englobas en una matriz de caracteres ( punto, por ejemplos );
|
||||
// 3<> Reemplazas cada caracter por el n<> de color que deseas que adopte.
|
||||
// ......<2E>.....................1
|
||||
// .....۱<>....................2 . 0 ( Color Invisible )
|
||||
// ....۱<><DBB1><EFBFBD>...................3 <20> C1
|
||||
// ...۲<><DBB2><EFBFBD><EFBFBD><EFBFBD>..................4 <20> C2
|
||||
// ..۲<><DBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.................5 <20> C3
|
||||
// .۲<><DBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>................6
|
||||
// .<2E><><EFBFBD>۱<EFBFBD><DBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...7
|
||||
// ....۲<><DBB2><EFBFBD>.......۱<><DBB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..8
|
||||
// ....۲<><DBB2><EFBFBD>......۱<><DBB1><EFBFBD><EFBFBD><EFBFBD>۱<EFBFBD><DBB1><EFBFBD>.9
|
||||
// ....۲<><DBB2><EFBFBD>.....۱<><DBB1><EFBFBD>....۱<><DBB1><EFBFBD>-
|
||||
// ....۲<><DBB2><EFBFBD>......۱<><DBB1>....۱<><DBB1>.1
|
||||
// ...۲<><DBB2><EFBFBD><EFBFBD><EFBFBD>......<2E><>....۱<><DBB1>..2
|
||||
// ..۲<><DBB2>۱<EFBFBD><DBB1><EFBFBD>..........۱<><DBB1>...3
|
||||
// .۲<><DBB2><EFBFBD>.۱<><DBB1><EFBFBD>........۱<><DBB1>....4
|
||||
// ۲<><DBB2><EFBFBD>...۱<><DBB1><EFBFBD>......۱<><DBB1>.....5
|
||||
// ...................۱<><DBB1>.....6
|
||||
// ....................<2E><>......7
|
||||
// ............................8
|
||||
// ....................<2E><>......9
|
||||
// ...................۱<><DBB1>.....-
|
||||
// ....................<2E><>......1
|
||||
// 123456789-123456789-12345678
|
||||
#include <dos.h>
|
||||
#include <alloc.h>
|
||||
#include <conio.h>
|
||||
#include <stdlib.h>
|
||||
#include <graphics.h>
|
||||
|
||||
void InicializaSVGA(void);
|
||||
void PreparaCuadricula256col(void);
|
||||
extern int far _Cdecl Svga256_fdriver[];
|
||||
int huge DetectVGA256(){ return 2; }
|
||||
|
||||
#define T 255
|
||||
#define C1 31
|
||||
#define C2 4
|
||||
#define C3 12
|
||||
|
||||
|
||||
#define Ancho_Pantalla 640
|
||||
#define Largo_Pantalla 640
|
||||
|
||||
unsigned char Puntero [ /* 21 * 28 */ ] = {
|
||||
T, T, T, T, T, T, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, T, T, T, T, C1, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, T, T, C1, C3, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, T, C1, C3, C3, C2, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, C1, C3, C3, C2, C2, C2, C2, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, C1, C1, C1, C1, C2, C2, C2, C1, C1, C1, C1, T, T, T, T, T, C1, C1, C1, C1, C1, C1, C1, C1, T, T, T
|
||||
, T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, T, C1, C2, C2, C2, C2, C2, C2, C2, C2, C1, T, T
|
||||
, T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C2, C1, C1, C1, C1, C2, C2, C2, C1, T
|
||||
, T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, C1, C2, C2, C2, C1
|
||||
, T, T, T, T, C1, C3, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, C1, C2, C2, C1, T
|
||||
, T, T, T, C1, C3, C2, C2, C2, C2, C1, T, T, T, T, T, T, C1, C1, T, T, T, T, C1, C2, C2, C1, T, T
|
||||
, T, T, C1, C3, C2, C2, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T
|
||||
, T, C1, C3, C2, C2, C1, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T
|
||||
, C1, C3, C2, C2, C1, T, T, T, C1, C2, C2, C2, C1, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C2, C2, C1, T, T, T, T, T
|
||||
, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, C1, C1, T, T, T, T, T, T
|
||||
};
|
||||
|
||||
char raton = 0; // Indica si hay raton conectado
|
||||
|
||||
unsigned char *Fondo_Raton;// En esta variable hemos de guardar lo que hab<61>a al fondo
|
||||
// antes de pintar el rat<61>n para conservarlo cuando lo movamos
|
||||
|
||||
int X_Mouse, Y_Mouse; // Estas variables se cargan tras
|
||||
// regresar de Anclar_Raton, si
|
||||
// devuelven -1, no se puls<6C> el RATON
|
||||
|
||||
void Inicializa_Raton(int x1, int y1, int x2, int y2);
|
||||
int Anclar_Raton(void);
|
||||
unsigned char Pon_Pixel( unsigned long y, unsigned long x, unsigned char color );
|
||||
|
||||
void far *image;
|
||||
void far *Puntero_en_este_momento;
|
||||
|
||||
void main( void )
|
||||
{
|
||||
char Resultado;
|
||||
|
||||
image = (void far *)farmalloc( 50*50 + 10 );
|
||||
Puntero_en_este_momento = (void far *)farmalloc( 50*50 + 10 );
|
||||
|
||||
// Inicializamos el modo SVGA 640*480 256 c. ( VESA )
|
||||
InicializaSVGA();
|
||||
|
||||
getimage( 100, 100, 150, 150, Puntero_en_este_momento );
|
||||
|
||||
PreparaCuadricula256col();
|
||||
|
||||
Inicializa_Raton( 10, 10, 630, 470);
|
||||
|
||||
if ( !raton )
|
||||
{
|
||||
closegraph();
|
||||
cprintf( " Para este ejemplo se precisa Raton \n\r " );
|
||||
return;
|
||||
}
|
||||
|
||||
Resultado = Anclar_Raton();
|
||||
|
||||
// Regresamos al modo texto
|
||||
restorecrtmode();
|
||||
|
||||
if ( Resultado )
|
||||
{
|
||||
if ( X_Mouse == Y_Mouse && Y_Mouse == -1 )
|
||||
cprintf( " Se pulso una tecla, 1<>Scan Code: % 3d \n\r", getch() );
|
||||
else
|
||||
cprintf( " Se pulso un Boton en X: % 3d -- Y: % 3d \n\r", X_Mouse, Y_Mouse );
|
||||
}
|
||||
else
|
||||
cprintf( " Error Interno de asignacion de memoria \n\r" );
|
||||
|
||||
|
||||
|
||||
farfree(image);
|
||||
}
|
||||
|
||||
|
||||
// los par<61>metros son las cotas para el raton
|
||||
void Inicializa_Raton(int x1, int y1, int x2, int y2)
|
||||
{
|
||||
|
||||
// Por defecto el raton aparecer<65> en las coordenadas ( 50, 50 )
|
||||
int px = 50, py = 50;
|
||||
|
||||
// Pero si Y_ y X_ tienen unas coordenadas el raton se posiciona alli.
|
||||
if ( Y_Mouse != -1 && X_Mouse != -1 )
|
||||
{
|
||||
px = X_Mouse; py = Y_Mouse;
|
||||
}
|
||||
|
||||
union REGS ent, sal;
|
||||
long dir;
|
||||
|
||||
ent.x.ax = 0;
|
||||
int86(0x33, &ent, &sal); /* averigua si hay rat<61>n conectado */
|
||||
|
||||
raton = sal.x.ax; /* indica a la variable global el estado
|
||||
del raton */
|
||||
|
||||
if(raton!=0) {
|
||||
|
||||
ent.x.ax = 15;
|
||||
ent.x.cx = 5;
|
||||
ent.x.dx = 11;
|
||||
int86(0x33, &ent, &sal); /* fija la raz<61>n mickey/pixel */
|
||||
|
||||
ent.x.ax = 7;
|
||||
ent.x.cx = x1;
|
||||
ent.x.dx = x2;
|
||||
int86(0x33, &ent, &sal); /* fija la posici<63>n m<>x. y m<>n. horizontal */
|
||||
|
||||
ent.x.ax = 8;
|
||||
ent.x.cx = y1;
|
||||
ent.x.dx = y2;
|
||||
int86(0x33, &ent, &sal); /* fija la posici<63>n m<>x. y m<>n. vertical */
|
||||
|
||||
ent.x.ax = 4;
|
||||
ent.x.cx = px;
|
||||
ent.x.dx = py;
|
||||
int86(0x33, &ent, &sal); /* fija la posici<63>n del rat<61>n */
|
||||
|
||||
ent.x.ax = 2; // Como sabes hacer esto, no sirve para nada
|
||||
int86(0x33, &ent, &ent); // por que el raton no se puede mostrar y por
|
||||
// deducion, tan poco ocultar.
|
||||
// Pero " Por si el modo no es SVGA ", lo ocultamos
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Dado que aun no sabes como modificar una interrupci<63>n creo que esta
|
||||
// rutina te dar<61> una idea mucho mas sencilla de como se gestiona el
|
||||
// raton en SVGA.
|
||||
// De esta funci<63>n solo se regresa cuando se pulse una tecla o un Boton.
|
||||
// Devuelve 1 si todo va bien, o 0 si hay un error interno de gesti<74>n.
|
||||
int Anclar_Raton(void)
|
||||
{
|
||||
char i=0,j=0;
|
||||
union REGS io;
|
||||
io.x.ax = 3;
|
||||
|
||||
static int Old_X_Mouse = X_Mouse, Old_Y_Mouse = Y_Mouse;
|
||||
char ok = 0, Draw = 1;
|
||||
|
||||
|
||||
if ( ( Fondo_Raton = (char *)malloc( 28*21 ) ) == NULL )
|
||||
return 0;
|
||||
|
||||
do{
|
||||
if( Draw )
|
||||
{
|
||||
|
||||
// Antes de dibujar el puntero capturamos lo que hay en ese trozo
|
||||
// de pantalla.
|
||||
// Luego Dibujamos el puntero;
|
||||
/*
|
||||
for( i = 0; i < 21; i++)
|
||||
for( j = 0; j < 28; j++ )
|
||||
{
|
||||
Fondo_Raton[ i*28 + j ] = getpixel( (j + X_Mouse), (i + Y_Mouse) );
|
||||
if( Puntero[ i*28 + j ] != 255 )
|
||||
putpixel( (j + X_Mouse), (i + Y_Mouse), Puntero[ i*28 + j ] );
|
||||
}
|
||||
*/
|
||||
getimage( (X_Mouse), (Y_Mouse), (X_Mouse)+50, (Y_Mouse)+50, image );
|
||||
putimage( (X_Mouse), (Y_Mouse), Puntero_en_este_momento, COPY_PUT );
|
||||
}
|
||||
|
||||
Draw = 0;
|
||||
|
||||
// Esperamos a que se mueva el raton / pulse un boton o una tecla
|
||||
do{
|
||||
// Gestionamos las teclas
|
||||
if ( kbhit() )
|
||||
{
|
||||
X_Mouse = Y_Mouse = -1;
|
||||
ok = 1;
|
||||
break;
|
||||
// Si no hay teclas, los par<61>metros del RATON habr<62>n cambiado
|
||||
} else {
|
||||
int86(0x33, &io, &io); // lee posici<63>n y estados del bot<6F>n
|
||||
X_Mouse = io.x.cx;
|
||||
Y_Mouse = io.x.dx;
|
||||
// <20> Se Puls<6C> Un BOTON ?
|
||||
// B.Izquierdo B. Derecho
|
||||
if ( (io.x.bx & 1) != 0 || ( (io.x.bx >> 1) & 1 ) != 0 )
|
||||
{
|
||||
ok = 1;
|
||||
break;
|
||||
} else
|
||||
/* <20> Se movi<76> el Puntero ? */
|
||||
if ( X_Mouse != Old_X_Mouse || Y_Mouse != Old_Y_Mouse )
|
||||
{
|
||||
|
||||
// Restauramos el contenido de la pantalla
|
||||
/*
|
||||
for( i = 0; i < 21; i++)
|
||||
for( j = 0; j < 28; j++ )
|
||||
putpixel( ( j + Old_X_Mouse), (i + Old_Y_Mouse), Fondo_Raton[ i*28 + j ] );
|
||||
*/
|
||||
putimage( (Old_X_Mouse), (Old_Y_Mouse), image, COPY_PUT );
|
||||
|
||||
Old_X_Mouse = X_Mouse;
|
||||
Old_Y_Mouse = Y_Mouse;
|
||||
Draw = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}while( 1 );
|
||||
|
||||
}while(!ok);
|
||||
|
||||
// Restauramos el contenido de la pantalla
|
||||
for( i = 0; i < 21; i++)
|
||||
for( j = 0; j < 28; j++ )
|
||||
putpixel( ( j + Old_X_Mouse), (i + Old_Y_Mouse), Fondo_Raton[ i*28 + j ] );
|
||||
|
||||
free( Fondo_Raton );
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void InicializaSVGA(void) {
|
||||
|
||||
int Gd = DETECT, Gm;
|
||||
int Drv, errorcode;
|
||||
|
||||
installuserdriver("Svga256",DetectVGA256);
|
||||
// registerfarbgidriver(Svga256_fdriver);
|
||||
|
||||
initgraph(&Gd,&Gm,"");
|
||||
|
||||
/* read result of initialization */
|
||||
errorcode = graphresult();
|
||||
|
||||
if (errorcode != grOk) /* an error occurred */
|
||||
{
|
||||
cprintf("Graphics error: %s\n", grapherrormsg(errorcode));
|
||||
cprintf("Presione una tecla para finalizar:");
|
||||
getch();
|
||||
exit(1); /* return with error code */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void PreparaCuadricula256col(void)
|
||||
{
|
||||
int x, y, color = 0;
|
||||
|
||||
for( y = 0; y < 16; y++ )
|
||||
for( x = 0; x < 16; x++ )
|
||||
{
|
||||
setcolor(color);
|
||||
setfillstyle( SOLID_FILL, color );
|
||||
bar( 40*x, 30*y, 40+40*x+40, 30+30*y);
|
||||
color++;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user