SMOUSE/SMOUSE.CPP
2021-09-08 21:39:44 +02:00

340 lines
10 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Demostraci¢n del uso del RATON en SVGA
// Jos David Guilln
//
// ßßßßßßßßßßßßßßß
// ßFuTuReßViSiOnß
// ßßßßßßßßßßßßßßß
// ßßÜÜÜÜÜßÜÜÜßßßß
// ßß ÛßÛ ßÜßß
// ßßÜ ÛßÛ Ûßß
// ßßßÜÜÜßßÛÜÜß ßß
//
//
//
// 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 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.
// ......Û.....................1
// .....Û±Û....................2 . 0 ( Color Invisible )
// ....Û±±±Û...................3 Û C1
// ...Û²±±±±Û..................4 ± C2
// ..Û²²±±±±±Û.................5 ² C3
// .Û²²±±±±±±±Û................6
// .ÛÛÛÛ±±±ÛÛÛÛ.....ÛÛÛÛÛÛÛÛ...7
// ....Û²±±Û.......Û±±±±±±±±Û..8
// ....Û²±±Û......Û±±±ÛÛÛÛ±±±Û.9
// ....Û²±±Û.....Û±±±Û....Û±±±Û-
// ....Û²±±Û......Û±±Û....Û±±Û.1
// ...Û²±±±±Û......ÛÛ....Û±±Û..2
// ..Û²±±Û±±±Û..........Û±±Û...3
// .Û²±±Û.Û±±±Û........Û±±Û....4
// Û²±±Û...Û±±±Û......Û±±Û.....5
// ...................Û±±Û.....6
// ....................ÛÛ......7
// ............................8
// ....................ÛÛ......9
// ...................Û±±Û.....-
// ....................ÛÛ......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¡a al fondo
// antes de pintar el rat¢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¢ 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 metros son las cotas para el raton
void Inicializa_Raton(int x1, int y1, int x2, int y2)
{
// Por defecto el raton aparecer  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¢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¢n mickey/pixel */
ent.x.ax = 7;
ent.x.cx = x1;
ent.x.dx = x2;
int86(0x33, &ent, &sal); /* fija la posici¢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¢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¢n del rat¢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¢n creo que esta
// rutina te dar  una idea mucho mas sencilla de como se gestiona el
// raton en SVGA.
// De esta funci¢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¢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 metros del RATON habr n cambiado
} else {
int86(0x33, &io, &io); // lee posici¢n y estados del bot¢n
X_Mouse = io.x.cx;
Y_Mouse = io.x.dx;
// ¨ Se Puls¢ Un BOTON ?
// B.Izquierdo B. Derecho
if ( (io.x.bx & 1) != 0 || ( (io.x.bx >> 1) & 1 ) != 0 )
{
ok = 1;
break;
} else
/* ¨ Se movi¢ 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++;
}
}