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

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.