Biblioteca de manejo de gráficos Windows BGI
La biblioteca Windows BGI (o WinBGI) es una versión de la BGI (Borland Graphics
Interface) con capacidad para crear gráficos en pantalla en aplicaciones de 16
bis sobre MS-DOS(R) y Windows(R).
Sus funciones permiten, entre otras cosas, escribir en modo gráfico en la
pantalla punto a punto, o figuras geométricas, copiar y modificar el contenido
de un trozo de la pantalla y manejar el ratón.
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 parámetros a la hora de enlazar: -lbgi -lgdi32
-luser32.
Las rutinas
Rutinas de inicialización
void initwindow(int ancho, int alto);
Esta rutina hay que llamarla antes que cualquier otra de esta biblioteca, ya
que inicializa el sistema gráfico y crea un ventana gráfica del tamaño
especificado en los parámetros. 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 gráfico, hay que llamar a esta rutina, que
libera toda la memoria reservada por el sistema gráfico y devuelve la pantalla
al modo en el que estaba antes de inicializar el modo gráfico.
Rutinas de escritura
void cleardevice(void);
Esta rutina borra la pantalla gráfica rellenándola del color de fondo y mueve
la posición de dibujo al origen de la pantalla, la posición (0,0).
void line(int x1, int y1, int x2, int y2);
Esta rutina dibuja una línea entre los puntos (x1, y1) y (x2, y2), con el
color, el estilo de línea y el ancho actuales. No mueve la posición de
escritura.
void circle (int x, int y, int radius);
Esta rutina dibuja un círculo en el color de dibujo actual cuyo centro está en
la posición (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 geométricas
void moveto (int x, int y);
Esta rutina mueve la posición 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 dirección y el tamaño actuales.
void putpixel(int x, int y, int color);
Esta rutina escribe un punto del color especificado en la posición (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 líneas y demás figuras.
getbkcolor devuelve el color de fondo actual.
int getch (void);
Esta rutina lee un carácter de la pantalla gráfica sin esperar que se pulse la
tecla de nueva línea. 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 KEY_HOME 71 // tecla Inicio
#define KEY_END 79 // tecla Fin
#define KEY_UP 72 // cursor hacia arriba
#define KEY_LEFT 75 // cursor hacia la izquierda
#define KEY_RIGHT 77 // cursor hacia la derecha
#define KEY_DOWN 80 // cursor hacia abajo
#define KEY_F1 59 // tecla de funcion F1
#define KEY_F2 60 // tecla de funcion F2
int getmaxx (void); int getmaxy (void);
Estas rutinas devuelven el valor máximo de x y de y,
respectivamente, para la pantalla gráfica.
unsigned getpixel (int x, int y);
Esta función 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 actualización de parámetros gráficos
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 parámetro y color de relleno.
void setlinestyle (int linestyle, unsigned upattern, int thickness);
Esta rutina establece el estilo de dibujo de las líneas.
Rutinas varias
void delay (int miliseg);
Esta rutina hace que el programa se pare durante el número de milisegundos que
se pasa como parámetro.
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 BLUE GREEN CYAN
RED MAGENTA BROWN LIGHTGRAY
DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN
LIGHTRED LIGHTMAGENTA YELLOW 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 parámetros indican el tono de cada color.
Algunos enlaces con más información
- http://www.cs.colorado.edu/ main/bgi/doc/bgi.html
Ejemplo
Para compilar un programa con WinBGI usando Dev-Cpp es más cómodo hacer un
proyecto. Para hacer un patrón 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 círculo por la pantalla circularmente siguiendo
la pulsación de los cursores. El programa acaba cuando se pulsa la tecla ESC,
que corresponde al carácter 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;
}
File translated from
TEX
by
TTH,
version 3.59.
On 28 Apr 2004, 11:37.