Graficos en c++
Quisiera saber si es posible que me instruyeras como empezar a manejar los gráficos en c++, es decir aprender a hacer menús, ventanas, cajas de texto, como utilizar el mouse en c++.
Respuesta de dide
1
1
dide, Desarrollador de aplicaciones de escritorio y web, administrador...
Antes de hacer ventanas, cuadros, cajas de texto y tal te recomiendo que emppizes simplemente dibujando puntos y controlandolos, que no es cosa fácil. TE cedo una librería para que la utilices. En ella hay definidas unas cuantas funciones entre ellas la de activar el modo 13h ( modo gráfico 300 x 200 aprox y 256 colores ) la función pon_punto(x, y, color) entre otras ademas hay las funciones para controlar el rato! Algo excesivamente útil... Me costó mucho trabajo hacerlas ya que están en ensamblador, para mejorar su portabilidad y velocidad.
-----------------------------
Dide.h
-----------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <string.h>
#include <mouse.h>
#define VVID 0xA0000000L
#define CANT 500
char *fondo_mouse;
char *cursor_mouse;
int lx_mouse,ly_mouse;
int x_mouse,y_mouse;
int _mouse_cargado=0;
int _cursor_cargado=0;
typedef enum{F,V} boolea;
void modo_13h();
void modogra();
void cuadro(int x1,int y1,int x2, int y2, int color);
void boton(char *cadena,int x1,int y1, int x2, int y2, int color);
void IniMode (char Mode);//prototipo de la funcion
int get_pixel(int x, int y)
{
char color;
int offset=320*y+x;
color=peekb(0xA000,offset);
return color;
}
void IniMode(char Mode) //nueva funcion
{
asm xor ah, ah
asm mov al, Mode
asm int 10h
}
//Procedimiento que vuelve al modo texto 03h
void modo_texto()
{
asm mov ah,0x00 //Funci¢n que fija el modo de v¡deo
asm mov al,0x03 //Coloca el v¡deo en modo texto
asm int 0x10 //Llama a la interrupci¢n del v¡deo
}
//Procedimiento que visualiza un punto en pantalla
void pon_punto(int x,int y,unsigned char color)
{
asm{
mov ax,0xA000
mov es,ax // {; Point to segment of screen }
mov dx,[y]
mov bx, dx // {; bx = dx}
mov dh, dl // {; dx = dx * 256}
Xor dl, dl
Shl bx, 1
Shl bx, 1
Shl bx, 1
Shl bx, 1
shl bx, 1
shl bx, 1 // {; bx = bx * 64}
add dx, bx // {; dx = dx + bx (ie y*320)}
mov bx,[x] // {; get our x}
add bx, dx // {; finalise location}
mov di, bx // {; di = offset }
// {; es:di = where to go}
mov ah, [color]
mov es:[di],ah // {; move the value in ah to screen
// point es:[di] }
} //equivale a esto:
// pokeb(0xA000,y*320+x,Color); //Ponemos un byte en la memoria de v¡deo
}
void modo_13h()
{
asm mov ah,0x00 //Funci¢n que fija el modo de v¡deo
asm mov al,0x13 //Coloca el v¡deo en modo 13 (320x200x256)
asm int 0x10 //Llama a la interrupci¢n del v¡deo
}
// RECTANGLE CON LOS BORDER DE COLORES
void lineaH(int x1,int x2,int y,int color)
{
int i;
for(i=x1;i<=x2;i++)
{
pon_punto(i,y,color);
}
}
void lineaV(int y1,int y2,int x, int color)
{
int i;
for(i=y1;i<=y2;i++)
{
pon_punto(x,i,color);
}
}
void recta(int x1, int y1, int x2, int y2,int color)
{
lineaH(x1,x2,y1,color);
lineaH(x1,x2,y2,color);
lineaV(y1,y2,x1,color);
lineaV(y1,y2,x2,color);
}
void cuadro13(int x1,int y1, int x2, int y2, int color)
{
int i;
for(i=y1;i<y2;i++)
{
lineaH(x1,x2,i,color);
}
}
int activa_mouse()
{
union REGS r;
r.x.ax=SERV_ACTIVA_MOUSE;
int86(INT_MOUSE,&r,&r);
if (r.x.ax){
_mouse_cargado=1;
return 1;
}
return 0;
}
int get_x_mouse()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.cx;
}
int get_y_mouse()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.dx;
}
int pulsado_left()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.bx&1;
}
int pulsado_right()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.bx&2;
}
/*
void carga_cursor (char *nombre_fichero)
{
int i,j;
FILE *fp;
if ((fp=fopen(nombre_fichero,"rb"))==NULL){
printf("Error al abrir el fichero %s",nombre_fichero);
exit (EXIT_FAILURE);
}
if (!_mouse_cargado) return;
if (_cursor_cargado) libera_cursor();
fread(&lx_mouse,sizeof (char),1,fp);
fread(&ly_mouse,sizeof (char),1,fp);
x_mouse=LX/2;
y_mouse=LY/2;
if ((fondo_mouse=malloc(sizeof (char)*lx_mouse*ly_mouse))==NULL){
printf("Error de memoria");
exit(EXIT_FAILURE);
}
if ((cursor_mouse=malloc(sizeof (char)*lx_mouse*ly_mouse))==NULL){
printf("Error de memoria");
exit(EXIT_FAILURE);
}
fread(cursor_mouse,sizeof (char)*lx_mouse*ly_mouse,1,fp);
fclose(fp);
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
_cursor_cargado=1;
}
void pinta_mouse()
{
if (!_cursor_cargado) return;
borra_mouse();
if ( (x_mouse=get_x_mouse())>LX-lx_mouse){
x_mouse=LX-lx_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
if ( (y_mouse=get_y_mouse())>LY-ly_mouse){
y_mouse=LY-ly_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
pon_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,cursor_mouse);
}
void set_xy_mouse(int x,int y)
{
union REGS r;
r.x.ax=SERV_SET_MOUSE_XY;
r.x.cx=x;
r.x.dx=y;
int86(INT_MOUSE,&r,&r);
}
void borra_mouse()
{
if (!_cursor_cargado) return;
pon_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
}
*/
int mouse_movido()
{
if (!_cursor_cargado) return 0;
if (x_mouse!=get_x_mouse() || y_mouse!=get_y_mouse())
return 1;
return 0;
}
void libera_cursor()
{
free (cursor_mouse);
free (fondo_mouse);
_cursor_cargado=0;
} /*
void lee_fondo_mouse()
{
if ( (x_mouse=get_x_mouse())>LX-lx_mouse){
x_mouse=LX-lx_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
if ( (y_mouse=get_y_mouse())>LY-ly_mouse){
y_mouse=LY-ly_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
}
*/
---------------------------
MOUSE.H
---------------------------
#define INT_MOUSE 0x33
#define SERV_ACTIVA_MOUSE 0x00
#define SERV_MUESTRA_MOUSE 0x01
#define SERV_GET_MOUSE_STATUS 0x03
#define SERV_SET_MOUSE_XY 0x04
#define LX_MOUSE 640
#define LY_MOUSE 200
int activa_mouse();
void muestra_mouse();
int get_x_mouse();
int get_y_mouse();
int pulsado_left();
int pulsado_right();
void pinta_mouse();
void carga_cursor (char *nombre_fichero);
void set_xy_mouse(int x,int y);
void borra_mouse();
int mouse_movido();
void libera_cursor();
void lee_fondo_mouse();
--------------------------
-----------------------------
Dide.h
-----------------------------
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <math.h>
#include <string.h>
#include <mouse.h>
#define VVID 0xA0000000L
#define CANT 500
char *fondo_mouse;
char *cursor_mouse;
int lx_mouse,ly_mouse;
int x_mouse,y_mouse;
int _mouse_cargado=0;
int _cursor_cargado=0;
typedef enum{F,V} boolea;
void modo_13h();
void modogra();
void cuadro(int x1,int y1,int x2, int y2, int color);
void boton(char *cadena,int x1,int y1, int x2, int y2, int color);
void IniMode (char Mode);//prototipo de la funcion
int get_pixel(int x, int y)
{
char color;
int offset=320*y+x;
color=peekb(0xA000,offset);
return color;
}
void IniMode(char Mode) //nueva funcion
{
asm xor ah, ah
asm mov al, Mode
asm int 10h
}
//Procedimiento que vuelve al modo texto 03h
void modo_texto()
{
asm mov ah,0x00 //Funci¢n que fija el modo de v¡deo
asm mov al,0x03 //Coloca el v¡deo en modo texto
asm int 0x10 //Llama a la interrupci¢n del v¡deo
}
//Procedimiento que visualiza un punto en pantalla
void pon_punto(int x,int y,unsigned char color)
{
asm{
mov ax,0xA000
mov es,ax // {; Point to segment of screen }
mov dx,[y]
mov bx, dx // {; bx = dx}
mov dh, dl // {; dx = dx * 256}
Xor dl, dl
Shl bx, 1
Shl bx, 1
Shl bx, 1
Shl bx, 1
shl bx, 1
shl bx, 1 // {; bx = bx * 64}
add dx, bx // {; dx = dx + bx (ie y*320)}
mov bx,[x] // {; get our x}
add bx, dx // {; finalise location}
mov di, bx // {; di = offset }
// {; es:di = where to go}
mov ah, [color]
mov es:[di],ah // {; move the value in ah to screen
// point es:[di] }
} //equivale a esto:
// pokeb(0xA000,y*320+x,Color); //Ponemos un byte en la memoria de v¡deo
}
void modo_13h()
{
asm mov ah,0x00 //Funci¢n que fija el modo de v¡deo
asm mov al,0x13 //Coloca el v¡deo en modo 13 (320x200x256)
asm int 0x10 //Llama a la interrupci¢n del v¡deo
}
// RECTANGLE CON LOS BORDER DE COLORES
void lineaH(int x1,int x2,int y,int color)
{
int i;
for(i=x1;i<=x2;i++)
{
pon_punto(i,y,color);
}
}
void lineaV(int y1,int y2,int x, int color)
{
int i;
for(i=y1;i<=y2;i++)
{
pon_punto(x,i,color);
}
}
void recta(int x1, int y1, int x2, int y2,int color)
{
lineaH(x1,x2,y1,color);
lineaH(x1,x2,y2,color);
lineaV(y1,y2,x1,color);
lineaV(y1,y2,x2,color);
}
void cuadro13(int x1,int y1, int x2, int y2, int color)
{
int i;
for(i=y1;i<y2;i++)
{
lineaH(x1,x2,i,color);
}
}
int activa_mouse()
{
union REGS r;
r.x.ax=SERV_ACTIVA_MOUSE;
int86(INT_MOUSE,&r,&r);
if (r.x.ax){
_mouse_cargado=1;
return 1;
}
return 0;
}
int get_x_mouse()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.cx;
}
int get_y_mouse()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.dx;
}
int pulsado_left()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.bx&1;
}
int pulsado_right()
{
union REGS r;
r.x.ax=SERV_GET_MOUSE_STATUS;
int86(INT_MOUSE,&r,&r);
return r.x.bx&2;
}
/*
void carga_cursor (char *nombre_fichero)
{
int i,j;
FILE *fp;
if ((fp=fopen(nombre_fichero,"rb"))==NULL){
printf("Error al abrir el fichero %s",nombre_fichero);
exit (EXIT_FAILURE);
}
if (!_mouse_cargado) return;
if (_cursor_cargado) libera_cursor();
fread(&lx_mouse,sizeof (char),1,fp);
fread(&ly_mouse,sizeof (char),1,fp);
x_mouse=LX/2;
y_mouse=LY/2;
if ((fondo_mouse=malloc(sizeof (char)*lx_mouse*ly_mouse))==NULL){
printf("Error de memoria");
exit(EXIT_FAILURE);
}
if ((cursor_mouse=malloc(sizeof (char)*lx_mouse*ly_mouse))==NULL){
printf("Error de memoria");
exit(EXIT_FAILURE);
}
fread(cursor_mouse,sizeof (char)*lx_mouse*ly_mouse,1,fp);
fclose(fp);
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
_cursor_cargado=1;
}
void pinta_mouse()
{
if (!_cursor_cargado) return;
borra_mouse();
if ( (x_mouse=get_x_mouse())>LX-lx_mouse){
x_mouse=LX-lx_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
if ( (y_mouse=get_y_mouse())>LY-ly_mouse){
y_mouse=LY-ly_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
pon_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,cursor_mouse);
}
void set_xy_mouse(int x,int y)
{
union REGS r;
r.x.ax=SERV_SET_MOUSE_XY;
r.x.cx=x;
r.x.dx=y;
int86(INT_MOUSE,&r,&r);
}
void borra_mouse()
{
if (!_cursor_cargado) return;
pon_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
}
*/
int mouse_movido()
{
if (!_cursor_cargado) return 0;
if (x_mouse!=get_x_mouse() || y_mouse!=get_y_mouse())
return 1;
return 0;
}
void libera_cursor()
{
free (cursor_mouse);
free (fondo_mouse);
_cursor_cargado=0;
} /*
void lee_fondo_mouse()
{
if ( (x_mouse=get_x_mouse())>LX-lx_mouse){
x_mouse=LX-lx_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
if ( (y_mouse=get_y_mouse())>LY-ly_mouse){
y_mouse=LY-ly_mouse;
set_xy_mouse(x_mouse,y_mouse);
}
lee_sprite(x_mouse,y_mouse,lx_mouse,ly_mouse,fondo_mouse);
}
*/
---------------------------
MOUSE.H
---------------------------
#define INT_MOUSE 0x33
#define SERV_ACTIVA_MOUSE 0x00
#define SERV_MUESTRA_MOUSE 0x01
#define SERV_GET_MOUSE_STATUS 0x03
#define SERV_SET_MOUSE_XY 0x04
#define LX_MOUSE 640
#define LY_MOUSE 200
int activa_mouse();
void muestra_mouse();
int get_x_mouse();
int get_y_mouse();
int pulsado_left();
int pulsado_right();
void pinta_mouse();
void carga_cursor (char *nombre_fichero);
void set_xy_mouse(int x,int y);
void borra_mouse();
int mouse_movido();
void libera_cursor();
void lee_fondo_mouse();
--------------------------
- Compartir respuesta
- Anónimo
ahora mismo