Está en la página 1de 8

Biblioteca de manejo de grficos Windows BGI

La biblioteca Windows BGI (o WinBGI) es una versin de la BGI (Borland Graphics


Interface) con capacidad para crear grficos en pantalla en aplicaciones de 16 bis sobre MSDOS(R) y Windows(R).
Sus funciones permiten, entre otras cosas, escribir en modo grfico en la pantalla punto a
punto, o figuras geomtricas, copiar y modificar el contenido de un trozo de la pantalla y
manejar el ratn.

Compilado y linkado
Para compilar un programa que use esta biblioteca hay que incluir el fichero de cabecera
winbgim.h:
Para linkar un programa que use esta biblioteca hay que enlazar la biblioteca libconio.a y
las bibliotecas libgdi32.a y libuser32.a. Para ello han de incluirse los siguientes parmetros
a la hora de enlazar: -lbgi -lgdi32 -luser32.

Las rutinas
Rutinas de inicializacin
void initwindow(int ancho, int alto);

Esta rutina hay que llamarla antes que cualquier otra de esta biblioteca, ya que inicializa el
sistema grfico y crea un ventana grfica del tamao especificado en los parmetros. El
sistema de referencia empieza en las coordenadas 0,0, que representa la esquina superior
izquierda, por lo que el eje y crece hacia la parte de abajo de la ventana.
void closegraph(void);

Al acabar de trabajar en el modo grfico, hay que llamar a esta rutina, que libera toda la
memoria reservada por el sistema grfico y devuelve la pantalla al modo en el que estaba
antes de inicializar el modo grfico.
Rutinas de escritura
void cleardevice(void);

Esta rutina borra la pantalla grfica rellenndola del color de fondo y mueve la posicin de
dibujo al origen de la pantalla, la posicin (0,0).
void line(int x1, int y1, int x2, int y2);

Esta rutina dibuja una lnea entre los puntos (x1, y1) y (x2, y2), con el color, el estilo de
lnea y el ancho actuales. No mueve la posicin de escritura.
void circle (int x, int y, int radius);

Esta rutina dibuja un crculo en el color de dibujo actual cuyo centro est en la posicin (x,
y) y de radio r.
void arc (int x, int y, int stangle, int endangle, int radius);
void bar(int izq, int arriba, int derecha, int abajo);
void bar3d (int left, int top, int right, int bottom, int depth, int
topflag);

void ellipse (int x, int y, int stangle, int endangle, int xradius, int
yradius);
void fillellipse (int x, int y, int xradius, int yradius);
void fillpoly (int numpoints, int *polypoints);
void pieslice (int x, int y, int stangle, int endangle, int radius);
void rectangle (int left, int top, int right, int bottom);
void sector (int x, int y, int stangle, int endangle, int xradius, int
yradius);

Estas otras rutinas dibujan diversas figuras geomtricas


void moveto (int x, int y);

Esta rutina mueve la posicin de dibujo a la coordenada (x, y).


void outtext(char cad[]);

Esta rutina escribe una cadena de caracteres en pantalla, usando el tipo de letra, la direccin
y el tamao actuales.
void putpixel(int x, int y, int color);

Esta rutina escribe un punto del color especificado en la posicin (x,y).


Rutinas de lectura
int getbkcolor (void); int getcolor (void);
getcolor devuelve el color de dibujo actual. se es el color en el que escriben los puntos
cuando se dibujan lneas y dems figuras. getbkcolor devuelve el color de fondo actual.
int getch (void);

Esta rutina lee un carcter de la pantalla grfica sin esperar que se pulse la tecla de nueva
lnea. Para las teclas extendidas, primero se lee el valor 0 y, en una segunda lectura, se lee
el valor correspondiente a cada tecla. Por ejemplo:
#define
#define
#define
#define
#define
#define
#define
#define

KEY_HOME
KEY_END
KEY_UP
KEY_LEFT
KEY_RIGHT
KEY_DOWN
KEY_F1
KEY_F2

71
79
72
75
77
80
59
60

//
//
//
//
//
//
//
//

tecla Inicio
tecla Fin
cursor hacia arriba
cursor hacia la izquierda
cursor hacia la derecha
cursor hacia abajo
tecla de funcion F1
tecla de funcion F2

int getmaxx (void); int getmaxy (void);


Estas rutinas devuelven el valor mximo de x y de y,

respectivamente, para la pantalla

grfica.
unsigned getpixel (int x, int y);

Esta funcin devuelve el color del pixel de la coordenada (x,y).


int getx (void); int gety (void);

Estas rutinas devuelven, respectivamente, la coordenada x y la coordenada y de dibujo.


Rutinas de actualizacin de parmetros grficos
void setcolor (int color); void setbkcolor (int color);

Estas rutinas establecen el nuevo color de dibujo y el nuevo color de fondo,


respectivamente.
void setfillstyle (int pattern, int color);

Esta rutina establece los nuevos parmetro y color de relleno.


void setlinestyle (int linestyle, unsigned upattern, int thickness);

Esta rutina establece el estilo de dibujo de las lneas.


Rutinas varias
void delay (int miliseg);

Esta rutina hace que el programa se pare durante el nmero de milisegundos que se pasa
como parmetro.
int kbhit (void);

Esta rutina devuelve 0 si no se ha pulsado ninguna tecla desde la ltima lectura y un valor
distinto de 0 en caso contrario.

Los colores en Windows BGI


Hay dos maneras de referirse a los colores en WinBGI. La primera es usar la paleta
tradicional de 16 colores, numerados del 0 al 15 y que tienen sus nombres propios:
BLACK
RED
DARKGRAY
LIGHTRED

BLUE
MAGENTA
LIGHTBLUE
LIGHTMAGENTA

GREEN
BROWN
LIGHTGREEN
YELLOW

CYAN
LIGHTGRAY
LIGHTCYAN
WHITE

La otra manera es formar un color indicando los tonos de rojo, azul y verde con valores
entre 0 y 255. Esto se hace con la macro COLOR(r, g, b), donde los tres parmetros
indican el tono de cada color.

Algunos enlaces con ms informacin

http://www.cs.colorado.edu/ main/bgi/doc/bgi.html

Ejemplo
Para compilar un programa con WinBGI usando Dev-Cpp es ms cmodo hacer un
proyecto. Para hacer un patrn de proyectos que permita compilar con WinBGI, antes de
arrancar el compilador, copia winbgi_appl.template y winbgim_cpp.txt en el directorio
Templates del compilador. Cuando vayas a hacer un programa que maneje la winbgim, abre
un proyecto de tipo "winbgi appl".
El fichero winbgim.h hay que copiarlo en el directorio Include del compilador y el fichero
libbgi.a hay que copiarlo en el directorio Lib del compilador.
El siguiente programa dibuja un crculo por la pantalla circularmente siguiendo la pulsacin
de los cursores. El programa acaba cuando se pulsa la tecla ESC, que corresponde al
carcter 27.
#include <winbgim.h>
// definicion de constantes
const int TAM_VEN_X = 700;
const int TAM_VEN_Y = 700;
const int RADIO_CIRCULO = 10;
using namespace std;
int main() {

int tecla, clr;


int maxx = TAM_VEN_X, maxy = TAM_VEN_Y, posx, posy;
bool fin = false;
posx = maxx / 2;
posy = maxy / 2;
// inicializacion de modo grafico
initwindow(maxx, maxy);
clr = getcolor();
do
{
setcolor(clr);
circle(posx, posy, RADIO_CIRCULO);
tecla = getch();
setcolor(getbkcolor());
circle(posx, posy, RADIO_CIRCULO);
switch(tecla)
{
case 0:
switch(getch())
{
case KEY_UP: // hacia arriba
posy = (posy + (maxy - RADIO_CIRCULO)) % maxy;
break;
case KEY_LEFT: // hacia la izquierda
posx = (posx + (maxx - RADIO_CIRCULO)) % maxx;
break;
case KEY_RIGHT: // hacia la derecha
posx = (posx + RADIO_CIRCULO) % maxx;
break;
case KEY_DOWN: // hacia abajo
posy = (posy + RADIO_CIRCULO) % maxy;
break;
}
break;
case 27: // tecla ESC
fin = true;
break;
}
}

while (!fin);

closegraph();
return 0;
}

Programacin grafica en DEV-C++


La librera winbgim.h a sido creada originalmente por Konstantin Knizhnik's winbgi
shareware y posteriormente modificada por Mark Richardson y Michael Main,
esta librera tiene como objetivo emular la librera graphics.h de Borland C++ y
facilitar algunas funciones del Mouse. La ventaja de esta librera es que nos
permite crear aplicaciones grficas con compiladores GNU tales como el ambiente
de desarrollo Dev C++ de la misma manera como se crean en el compilador
comercial Borland C++.
Originalmente el autor nos ofreca una coleccin de archivos que se deban ubicar
en carpetas especiales e incluir ciertos comandos al la configuracin del linker y
del compilador, esta operacin tenia cierta complejidad y para muchos se convirti
en un dolor de cabeza.
Con el fin de facilitar el uso de esta librera me tome la libertad de realizar un
instalador para la versin 4.9.9.2 del Dev C++ que realiza todas las
configuraciones necesarias.
Ahora cada ves que queramos realizar un programa con soporte para grficos solo
es necesario seguir los siguientes pasos:
1 - Crear un nuevo proyecto
2 - Seleccionar una aplicacin de consola con grficos
Y listo!
A continuacin algunos ejemplos
Para iniciar el modo grfico se usa la funcin void initwindow (int width, int height);
Ejemplo:
initwindow(400,300); // Abre una ventana grfica de 400x300 color rgb
Para cerrar el modo grfico se usa la funcin closegraph();
4.9.9.2

Ejemplos
#include <winbgim.h>
int main()
{
initwindow(400,300);
moveto(0,0);
lineto(50,50);
while(!kbhit());
closegraph();
return 0;
}

// Abre una ventana grfica de 400x300 pixeles


// Pone el cursor en 0,0
// Dibuja una lnea desde 0,0 hasta 50,50
// Espera a que el usuario presione una tecla
// Cierra la ventana grfica

Esta librera no solo soporta los 16 colores de la librera graphics.h de Borland


mediante las constantes BLACK BLUE GREEN CYAN RED MAGENTA BROWN
LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED
LIGHTMAGENTA YELLOW WHITE
sino que es posible usar colores rgb, lo cual nos da al rededor de 16 millones de
colores incrustando el macro COLOR(r,g,b) en donde originalmente estara el
indicado el color.
El resto de las funciones grficas funcionan igual que en la librera original
graphics.h y pueden encontrarse en la ayuda del Turbo C++ de Borland o e
cualquier manual de este mismo.
Funciones principales de la librera winbgim.h
void circle (int x, int y, int radius);
void cleardevice (void);
void line (int x1, int y1, int x2, int y2);
void lineto (int x, int y)
void putpixel (int x, int y, int color);
void rectangle (int left, int top, int right, int bottom);
void setcolor (int color);
int mousex(void)
int mousey(void)

//Ejemplo del uso de la librera winbgim


//Grfica de sen(x)
#include<winbgim.h>
#include<stdlib.h>
#include<math.h>
main()
{
const float pi=3.1415;
initwindow(640,480);
for (int x=0;x<640;x++)
putpixel(x,100+50*sin(2*pi*(float)x/640),WHITE);
system("pause");
closegraph();
}

//Ejemplo del uso de la librera winbgim


//Dibujo de un rectngulo, un circulo y un cuadrado
#include<winbgim.h>
#include<stdlib.h>
main()
{
initwindow(640,480);
circle(100,100,30);
moveto(50,50);
lineto(100,50);
lineto(100,100);

lineto(50,100);
lineto(50,50);
rectangle(100,100,200,200);
system("pause");
closegraph();
}

//Ejemplo del uso de la librera winbgim


//Dibujar con el mouse
#include<winbgim.h>
#include<stdlib.h>
#include<iostream.h>
main()
{
const float pi=3.1415;
initwindow(640,480);
int a=0,x,y;
while(a==0)
{
x=mousex( );
delay(1);
y=mousey( );
delay(1);
if (
lineto(x,y);
};
system("pause");
closegraph();
}

//Ejemplo del uso de la librera winbgim


//Pinta toda la pantalla con colores rgb
#include<winbgim.h>
#include<stdlib.h>
#include<iostream.h>
main()
{
int azul;
const float pi=3.1415;
cout << "Valor para el azul? ";
cin >> azul;
initwindow(255,255);
for (int y=1;y<255;y++)
for(int x=1;x<256;x++)
putpixel(x,y,COLOR(x,y,0));
system("pause");
closegraph();

}
i

C++

https://mega.co.nz/#F!sVxlRI7B!uBTLr3GiGW0dokYq9e4SgQ

También podría gustarte