Está en la página 1de 5

CAPTULO 11

CONTROLADORES GRFICOS
Y LENGUAJE C
11.1. CONTROLADORES GRFICOS
El PC compatible IBM, soporta diferentes controladores grficos, los cuales van desde el CGA hasta el
VGA y SVGA, pasando por EGA y HERCULES. Existen varias formas y modos de programacin de estos
controladores, los que pueden ser inicializados sin ningn problema por el lenguaje C. Los modos de trabajo
pueden ser alfanumrico y grfico, ambos modos pueden programarse utilizando funciones proporcionadas por C,
interrupciones lgicas o haciendo acceso directo a los puertos de programacin de la tarjeta grfica e incluso
pueden combinarse estas alternativas. En este captulo se revisa la forma ms simple de acceso al modo grfico,
haciendo uso de las funciones defnidas en graphics.h de Borland.
11.2. UTILIZANDO FUNCIONES DE GRAPHICS.H (SLO PARA MS-DOS)
El TurboC proporciona una biblioteca para el trabajo en modo grfico. Las funciones se encuentran
definidas en el archivo graphics.h, permiten inicializar y trabajar en modo grfico estando en DOS, adems de
una muy fcil manipulacin de la tarjeta grfica.
A continuacin se describen algunas de las funciones:
Funciones Descripcin
void far initgraph(int far *__graphdriver,
int far *__graphmode,
const char far *__pathtodriver);
Inicializa el modo grfico
void far detectgraph(int far *__graphdriver,
int far *__graphmode);
Autodetecta el adaptador grafico
void far closegraph(void);
Sale del modo grfico
Tabla 11.1. Funciones para inicializar el modo grfico.
Estas funciones permiten detectar e inicializar el adaptador grfico. El parmetro _graphdriver
permite manipular el adaptador grfico, _graphmode determina el modo de trabajo del adaptador y
_pathtodriver indica el directorio en el cual se encuentra el manejador grfico *.BGI que permite enlazar las
funciones grficas con las tarjeta correspondiente (Borland Graphics Interface).
_graphdriver puede tomar cualquiera de los siguientes valores definidos por la variable enum
graphics_drivers.
94 Preaparado por Juan Ignacio Huircn
Manejadores grficos Cdigo
DETECT
CGA, MCGA, EGA, EGA64, EGAMONO, IBM8514
HERCMONO, ATT400, VGA, PC3270
CURRENT_DRIVER= -1
Autodeteccion
1 - 6
7 - 10
Tabla 11.2. Manejadores grficos.
Los modos de trabajo estn definidos por la enumeracin enum graphics_modes, las cuales se
encuentran en la siguiente tabla.
Modos de trabajo de los
drivers
Resolucin
CGAC0 = 0
CGAC1 = 1
CGAC2 = 2
CGAC3 = 3
CGAHI = 4
MCGAC0 = 0
MCGAC1 = 1
MCGAC2 = 2
MCGAC3 = 3
MCGAMED = 4
MCGAHI = 5
EGALO = 0
EGAHI = 1
EGA64LO = 0
EGA64HI = 1
EGAMONOHI = 0
HERCMONOHI = 0
ATT400C0 = 0
ATT400C1 = 1
ATT400C2 = 2
ATT400C3 = 3
ATT400MED = 4
ATT400HI = 5
VGALO = 0
VGAMED = 1
VGAHI = 2
PC3270HI = 0
IBM8514LO = 0
IBM8514HI = 1
320x200 palette 0; 1 pag.
320x200 palette 1; 1 pag.
320x200 palette 2: 1 pag.
320x200 palette 3; 1 pag.
640x200 1 pag.
320x200 palette 0; 1 pag.
320x200 palette 1; 1 pag.
320x200 palette 2; 1 pag.
320x200 palette 3; 1 pag.
640x200 1 pag.
640x480 1 pag.
640x200 16 colores 4 pag.
640x350 16 colores 2 pag.
640x200 16 colores 1 pag.
640x350 4 colores 1 pag.
640x350 64K on card, 1 pag. - 256K on card, 4 pag.
720x348 2 pag.
320x200 palette 0; 1 pag.
320x200 palette 1; 1 pag.
320x200 palette 2; 1 pag.
320x200 palette 3; 1 pag.
640x200 1 pag.
640x400 1 pag.
640x200 16 colores 4 pag.
640x350 16 colores 2 pag.
640x480 16 colores 1 pag.
720x350 1 pag.
640x480 256 colores
1024x768 256 colores
Tabla 11.3. Modos de trabajo de los diferentes drivers.
Herramientas de Programacin 95
Ej 11.1. Programa para inicio modo grfico.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main(void)
{
int gdriver = DETECT, gmode, errorcode; /* auto deteccion */
initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); /* inicializa modo grafico */
errorcode = graphresult(); /* lee resultado de inicializacion */
if (errorcode != grOk) /* si ocurre error*/
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
line(0, 0, getmaxx(), getmaxy()); /* dibuja una linea */
getch(); /* espera por tecla */
closegraph();
return 0;
}
Adems de las ya mencionadas, existen una gran variedad de funciones grficas, las ms comunes son:
Funciones Descripcin
setgraphmode(int __mode);
putpixel(int __x, int __y, int __color);
setcolor(int __color);
rectangle(int __left, int __top,
int __right, int __bottom);
line(int __x1, int __y1,
int __x2, int __y2);
bar(int __left, int __top,
int __right, int __bottom);
void setfillstyle(int __pattern,
int __color);
int getmaxx();
int getmaxy();
Cambia el modo grfico
Dibuja un pixel
Cambia el color
Dibuja un rectangulo
Dibuja una linea
Dibuja una barra
Activa el color y el tipo de relleno de la barra
Retorna el mximo valor de x
Retorna el mximo valor de y
Tabla 11.4. Funciones bsicas para dibujar.
96 Preaparado por Juan Ignacio Huircn
Funciones Descripcin
setttextjustify(int __horiz, int __vert);
settextstyle(int __font, int __direction,
int __charsize);
outtextxy(int __x, int __y,
const char far *__textstring);
Justifica una cadena
Estilo de letra
Escribe una cadena
Figura 11.5. Funciones para manejo de cadenas sobre modo grfico.
Para mayor profundizacin, es recomendable revisar el archivo de cabecera graphics.h, ya sea de
TurboC 2.0 o TurboC++ 3.0.
Ej 11.2. Inicializando el modo grfico si chequear la ocurrencia de errores
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
int gdriver = VGA, gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
setcolor(LIGHTBLUE);
rectangle(0, 0, getmaxx(), getmaxy());
getch();
closegraph();
}
Un ejemplo clsico en el manejo grfico es la generacin de "ventanas", lo que permite realizar mens a
travs de barras de seleccin corredizas. Por ltimo, es posible realizar procedimiento para graficar seales.
Ej 11.3. Generacin de Ventanas. Se pueden hacer en modo grfico. La forma de hacer aparecer y desaparecer la
ventana (abrir y cerrar) es simple. Se debe almacenar el area en donde se va dibujar la ventana, luego se dibuja la
ventana y finalmente, para cerrar dicha ventana, se superpone al rea almacenada previamente, sobre la ventana
dibujada.
#include <graphics.h>
#include <alloc.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
char far *dib_vent(int x1, int y1, int x2, int y2, int color_bk);
void borra_vent(int x1, int y1, char far *pvent);
void msg(int x,int y,char *mensaje, int color_msg);
int maxx, maxy;
Herramientas de Programacin 97
void main(void)
{
char far *pvent;
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc\\bgi"); /*inicia modo grafico */
maxx=getmaxx();maxy=getmaxy();
setcolor(LIGHTGRAY);
rectangle(0,0,maxx,maxy);
msg(100,400,"<PRESIONE UNA TECLA>",GREEN);
getch();
pvent=dib_vent(100,100, 300,200,WHITE);
msg(100,400,"<PRESIONE UNA TECLA>", YELLOW);
getch();
if(pvent!=NULL) borra_vent(100,100,pvent);
msg(100,400,"<PRESIONE UN TECLA PARA SALIR>", RED);
getch();
closegraph();
}
char far *dib_vent(int x1, int y1, int x2, int y2, int color_bk)
{
char far *pvent;
unsigned tam;
tam = imagesize( x1, y1, x2, y2);
pvent=(char far *)farmalloc(tam);
if(pvent!=NULL)
{
getimage(x1, y1, x2, y2, pvent);
setfillstyle(1,color_bk);
bar(x1,y1,x2,y2);
setfillstyle(1,LIGHTBLUE);
bar(x1+1,y1+1,x2-1,y1+15);
}
return(pvent);
}
void borra_vent(int x1, int y1, char far *pvent)
{
putimage(x1, y1,pvent ,COPY_PUT);
farfree(pvent);
}
void msg(int x,int y,char *mensaje, int color_msg)
{
int largo;
largo=strlen(mensaje);
setcolor(color_msg);
setfillstyle(1,BLACK);
bar(x,y,x+largo*8,y+8);
outtextxy(x,y,mensaje);
}

También podría gustarte