texto de Turbo C.
1. Introduccin
Aunque el estndar de ANSI C no define funciones grficas ni de texto, estas son muy importantes para la
mayora de las tareas de programacin actuales. De hecho, los programas comerciales actualmente poseen
interfaces grficas.
Existen hoy en da varios tipos de adaptadores de vdeo, o tarjetas grficas disponibles para la lnea de
computadoras tipo PC. Las ms normales son la monocromtica, la CGA, la EGA y la VGA. Entre todos
estos adaptadores soportan muchos modos de vdeo distintos, mostraremos a continuacin algunos
estos modos son solo algunos de la gran variedad que podemos tener por lo que es
necesario que investiguemos todos los modos posibles.
Como hemos dicho podemos tener dos modos de funcionamiento, modo texto y modo grfico. La parte mas
pequea de la texto que es direccionable por el usuario en modo texto, es un carcter. Mientras que en modo
grfico se puede mostrar en la pantalla un pixel (punto direccionable sobre el monitor grfico) en este modo
podemos tener tanto texto como imgenes grficas.
Tanto en los modos de texto como en los grficos las posiciones individuales se refieren mediante su fila y
columna. En los modos grficos a la esquina superior izquierda de la pantalla le corresponde la posicin (0,0).
Mientras que para modo texto la esquina superior izquierda le corresponde la posicin (1,1).
Estas funciones necesitan que se incluya el header conio.h. Este archivo contiene diversas variables, tipos y
constantes que las funciones usan, as como sus prototipos.
Las funciones de texto de turbo C funcionan por medio de ventanas. Afortunadamente, la ventana por defecto
es la pantalla completa. Una ventana es una de las interfaces que usan los programas para mandar mensajes al
usuario. Puede ser tan grande como la pantalla u ocupar tan solo varios caracteres. En algunos programas es
bastante normal ver varias ventanas activas al mismo tiempo.
Turbo C permite definir la posicin y las dimensiones de una ventana. Despus de definirla, las rutinas de
turbo C que manipulan el texto solo afectaran a la ventana definida y no al resto de la pantalla. Por ejemplo la
funcin clscr() de turbo C limpiara la ventana activa, y no la pantalla completa. Adems todas las
coordenadas de posicin son relativas a la ventana activa y no a la pantalla.
Como las rutinas de salida de C, como printf(), no estn diseadas para usarlas en un entorno de pantalla
orientado a ventanas , turbo C contiene funciones de E/S que reconocen las ventanas. La funcin cprintf() es
muy similar a la funcin printf() y cputs() a puts(). Ambas funciones se diferencian de las de E/S estndar en
que reconocen las ventanas. La funcin putch() es parecida a putchar(), pero no permite que se escriban
caracteres fuera de la ventana actual. La funcin getche() no hace eco de la entrada fuera de la ventana activa.
La funcin cgets() es ligeramente distinta a su pariente de no ventanas gets(). Su prototipo es:
Al llamar a cgets(), es preciso poner en cad[0] la longitud mxima de la cadena que se va a leer . Cuando se
vuelve de cgets(), el numero total de caracteres ledos esta en cad[1], comenzando la cadena real en cad[2].
El siguiente programa muestra como usar cgets() para leer una cadena de 20 caracteres como mximo:
#include <conio.h>
int main(void)
char cad[80],*p;
cad[0] = 20;
return (0);
funcin propsito
escribir salida con formato en la ventana
cprintf()
activa
cputs() escribir una cadena en la ventana activa
putch() saca un carcter por la ventana activa
getche() lee un carcter de la ventana activa
cgets() lee una cadena de la ventana activa
void clrscr(void);
La funcin clreol() limpia una lnea desde la posicin actual del cursor hasta el limite derecho de la ventana
. Su prototipo es :
void clreol(void);
Las funciones delline() e insline() se usan, respectivamente, para borrar una lnea o para insertar una en
blanco. Sus prototipo son:
void delline(void);
void insline(void);
La llamada a delline() borra la lnea sobre la que esta el cursor y desplaza hacia arriba todas las lneas
siguientes. La llamada a insline() inserta una lnea en blanco justo debajo de aquella sobre la que se encuentre
el curso y desplaza una lnea hacia abajo todas las siguientes.
Una de las funciones mas tiles es gotoxy(), que se usa para colocar el cursor en una posicin determinada de
la ventana activa. Su prototipo es:
Las funciones hermanas gettext() y puttext() se usan respectivamente, para copiar texto de la pantalla a un
buffer y de un buffer a la pantalla. Sus prototipos son :
int gettext(int izquierda, int arriba, int derecha, int abajo, void *buffer);
int puttext(int izquierda, int arriba, int derecha, int abajo, void *buffer);
Para gettext() se especifica las coordenadas de las esquinas superior izquierda e inferior derecha de la regin
de la pantalla que se desea copiar. El puntero buffer debe apuntar a una zona de la memoria lo
suficientemente grande como para contener el texto. El tamao del buffer se calcula con la siguiente formula:
por ejemplo, si se llama a gettext() con 1,1 como primer par de coordenadas y 10,10 como segundo , hara
falta 10*10*2=200 bytes de almacenamiento.
Este fragmento de programa copia una regin de la pantalla a la zona de memoria apuntada por buf:
void *buf;
buf = malloc(10*10*2);
gettext(10,10,20,20,buf);
Si lo que quieres es copiar texto de una parte de la pantalla a otra, es mas eficiente usar la funcin movetext()
que llamar a gettext() y despus a puttext(). El prototipo de movetext() es:
int movetext(int arriba, int izquierda, int derecha, int abajo, int nuevoarriba, int nuevoabajo);
La funcin movetext() devuelve 0 si alguna coordenada esta fuera del rango permitido; en caso contrario
devuelve 1.
La funcin window() activa una ventana de texto con unas dimensiones especificas. su prototipo es:
Si alguna coordenada no es valida window() no hace nada. Una vez llevada a cabo una llamada a window(),
todas las referencias a coordenadas de posicin se hacen relativas a esa ventana, no a al pantalla. Por ejemplo
este fragmento de cdigo crea una ventana y escribe una lnea de texto dentro de la ventana en la posicin 2,3:
gotoxy(2,3);
es importante entender que las coordenada que se usan para window() son absolutas (no relativas a la ventana
activa en ese momento). De esta manera se pueden usar mltiples ventanas sin estar anidadas unas dentro de
otras.
El siguiente programa dibuja en primer lugar un borde alrededor de la pantalla y despus crea dos ventanas
separadas.
#include <conio.h>
int main(void)
{
clrscr();
borde(1,1,79,25);
window(3,2,40,9);
borde(3,2,40,9);
gotoxy(3,2);
cprintf("primera ventana");
window(30,10,60,18);
borde(30,10,60,18);
gotoxy(3,2);
cprintf("segunda ventana");
gotoxy(5,4);
cprintf("hola");
getche();
return(0);
gotoxy(1,1);
putch(-);
gotoxy(1; yfinal-yinicial; i++);
putch(-);
gotoxy(1,i);
putch(|);
gotoxy(xfinal-xinicial+1,i);
putch(|);
Es posible cambiar los modos de vdeo, as como controlar el color del texto y del fondo y poner la pantalla
en alta o en baja densidad.
Las funciones highvideo() y lowvideo() ponen la pantalla en alta o baja intensidad respectivamente. Sus
prototipos son:
void highvideo(void);
void lowvideo(void);
La funcin norvideo() provoca que los caracteres vuelvan a mostrarse en la intensidad que estaba activada en
el momento de comenzar la ejecucin del programa. Su prototipo es:
void normvideo(void);
La funcin textcolor() determina el color del texto que se vaya a mostrar a partir de ese momento. Tambin
se usa para provocar el parpadeo del texto. El prototipo de textcolor() es:
el argumento color puede tomar valores de 0 a 15, correspondientes cada uno de ellos a un color diferente, o
bien usar los macros definidos en conio.h. Estos valores se muestran a continuacin:
Equivalente
Macro
entero
BLACK 0
BLUE 1
GREEN 2
CYAN 3
RED 4
MAGENTA 5
BROWN 6
LIGHTGRAY 7
DARKGRAY 8
LIGHTBLUE 9
LIGHTGREEN 10
LIGHTCYAN 11
LIGHTRED 12
LIGHTMAGENTA 13
YELLOW 14
WHITE 15
BLINK 128
Para hacer que el texto parpadee se debe hacer una OR (o lgica) del valor 128, con el color
que se desee. Por ejemplo, este fragmento de cdigo provoca que el texto se muestre a
partir del momento de ejecutarlo aparezca verde y parpadeante:
textcolor(GREEN | BLINK)
La funcin textbackground() se usa para establecer el color del fondo del texto. Como con
textcolor(), la ejecucin de textbackground() solo afecta al color de fondo de las
escrituras subsiguientes. Su prototipo es:
La funcin textattr() establece a la vez el color del texto y del fondo. Su prototipo es:
Si el bit 7 esta activado, el texto parpadeara. Los bits del 6 al 4 determinan el color del
fondo. Los bits del 3 al 0 el color del texto.
La funcin textmode() se utiliza para cambiar el modo de vdeo. Su prototipo es:
el argumento modo debe tomar uno de los valores que se muestra a continuacin:
Turbo C proporciona tres funciones para modos de texto que devuelven el estado de la pantalla. Estas
funciones se muestran a continuacin:
Funcin Propsito
Devuelve informacin sobre la ventana de
gettexinfo()
texto
wherex() Devuelve la coordenada x del cursor
wherey() Devuelve la coordenada y del cursor
int wherex(void);
int wherey(void);
La funcin wherex() devuelve la coordenada X de la posicin actual del cursor. La funcin
wherey() devuelve la coordenada actual del cursor. Ambas coordenadas son relativas a la
ventana de texto actual.
esta funcin es similar a scanf() excepto en que lee la informacin desde la consola en
lugar de desde stdin. La funcin cscanf() devuelve el numero de argumento a los que en
realidad se les asigna valores. Esta funcin devuelve el valor EOF si existe algn error.
Ejemplo: Este fragmento de cdigo lee una cadena y un numero float de la consola:
char cad[80];
float f;
cscanf("%s%f",cad,&f);
Finalmente para terminar los grficos en modo texto realizaremos un pequeo programa de
demostracin. El cual inicialmente se utiliza la funcin gotoxy() para colocar un carcter en
la posicin dada por gotoxy(), despus utiliza los distintos colores de modo y de texto, y
finalmente mueve una parte del texto por medio de la funcin movetext() :
#include<conio.h>
int main(void)
register int i, j;
clrscr();
/* demostracin de la funcin gotxy() */
for(i=1;j=1;j<24;i++,j++){
gotoxy(i,j);
printf("x");
gotoxy( i, j );
cprintf("x");
textbackground(LIGHTBLUE);
textcolor(RED);
gotoxy(40,12);
gotoxy(45,15);
textcolor(GREEN | BLINK);
textbackground(BLACK);
getch();
movetext(20,20,28,24,20,1);
getch();
texmode(LASTMODE);
return (0);
Empezaremos con el estudio de los grficos para lo cual es necesario que el header graphics.h se incluya en
cualquier programa que las use.
Recuerda que para usar las rutinas de grficos de Turbo C, la computadora debe estar provista de un
adaptador grfico de vdeo. Esto implica que aquellos sistemas que solo tengan una tarjeta monocroma no
podr mostrar grficos. Los ejemplos que se incluyen en este capitulo usan todos el modo 16 de VGA (640*
350, 16 colores). Si no se tiene una VGA debers de hacer los cambios pertinentes en estos ejemplos.
Es necesario poner el adaptador de vdeo en alguno de sus modos grficos antes de poder usar cualquiera de
las funciones de grficos. Para poner el adaptador en un modo grfico usa la funcin initgraph(). Su prototipo
es:
void far initgraph(int far *controlador, int far *modo, char far *camino);
La funcin initgraph() carga en memoria el controlador de grficos correspondiente al numero apuntado por
controlador. El parmetro modo apunta a un entero que especifica el modo de vdeo que van a usar las
funciones de grficos. Finalmente, se puede especificar el encaminamiento al controlador en la cadena
apuntada por camino. Si no se especifica este ultimo se busca en el directorio actual.
Los archivos BGI. que deben estar disponibles en el sistema contienen los controladores de grficos. El
header graphics.h define varias macros que se pueden usar para este propsito. Son las siguientes:
Macro Equivalente
DETECT 0
CGA 1
MCGA 2
EGA 3
EGA64 4
EGAMONO 5
IBM8514 6
HERCMONO 7
ATT400 8
VGA 9
PC3270 10
Al usar DETECT, initgraph() detecta automticamente el tipo de hardware de vdeo
presente en el sistema y selecciona el modo de vdeo con la resolucin mas alta.
El valor de modo debe de ser uno de los modos de grficos que se muestran en la siguiente
tabla:
y otros mas que no mencionaremos aqu, pero que debes de investigar. Por ejemplo, para
que el sistema se inicialice en grficos CGA con 4 colores y resolucin 320*200, se usara
el siguiente fragmento de programa. Se asume que el archivo .BGI del controlador de
grficos se encuentra en el directorio actual. (de no se as debes colocarlo en " " toda la ruta
completa por ejemplo c:\tc\bgi).
#include<graphics.h>
controlador = CGA;
modo = CGAC0;
initgraph(&controlador,&modo," ");
Para dejar de utilizar un modo grfico de vdeo y volver a un modo de texto, se usa
closegraph() o restorecrtmode(). Sus prototipos son:
1. Grficos bsicos
Las funciones fundamentales de grficos son las que dibujan un punto, una lnea y un circulo. En turbo C
estas funciones se llaman respectivamente, putpixel(), line() y circle(). Sus prototipos son:
void far line( int xinicial, int yinicial, int xfinal, int yfinal);
La funcin putpixel() pone un pixel en la posicin determinada por x e y del color especificado por color. La
funcin line() traza una lnea desde la posicin especificada por xinicial, yinicial hasta xfinal, yfinal con el
color del dibujo, estilo y grosor de lnea actuales. La funcin circle() dibuja un circulo de radio dado con el
centro en la posicin especificada por x, y , usando el color de dibujo y grosor actuales. Si cualquier de las
coordenadas cae fuera de los limites, la funcin correspondiente no se ejecuta.
El valor de color debe estar dentro del rango permitido para el modo de grfico actual:
Macro Valor
BLACK 0
BLUE 1
GREEN 2
CYAN 3
RED 4
MAGENTA 5
BROWN 6
LIGHTGRAY 7
DARKGRAY 8
LIGHTBLUE 9
LIGHTGREEN 10
LIGHTCYAN 11
LIGHTRED 12
LIGHTMAGENTA 13
YELLOW 14
WHITE 15
Para rellenar cualquier figura cerrada se usara la funcin floodfill(). Su prototipo es:
Esta funcin rellena una figura cerrada. Se le pasan como parmetros las coordenadas de un
punto interior a la figura y el color de las lneas que forman la figura. Es preciso que el
objeto a rellenar este completamente cerrado. El color de fondo es el que se usa por defecto
sin embargo se puede cambiar la manera en que se rellena los objetos mediante
setfillstyle(). Su prototipo es:
#include<graphics.h>
#include<conio.h>
void borde(void);
void cuadro(int xinicial, int yinicial, int xfinal, int yfinal, int color);
int main(void)
{
register int i;
controlador = VGA;
modo = VGAMED;
borde();
setcolor(1);
line(0,0,639,349);
setcolor(2);
setcolor(1);
line(50,200,400,125);
/* algunos puntos */
putpixel(i,175,5);
setfillstyle(SOLID_FILL, GREEN);
floodfill(500, 250, 1); /* rellena parte de un circulo */
restorecrtmode();
return (0);
void borde(void)
line(0, 0, 0, 349);
void cuadro( int xinicial, int yinicial, int xfinal, int yfinal, int color);
setcolor(color);
Esta funcin escribe la cadena apuntada por cad en la posicin actual. La principal ventaja de usar outtext()
es que puede escribir el texto con distintas fuentes, tamaos e incluso direcciones.
Para cambiar el estilo, tamao o direccin del texto, se usa settextstyle(). Su prototipo es:
El parmetro fuente determina el tipo de fuente que se va a usar. Por defecto se usa la 8*8 define en hardware.
Puede tomar uno de los siguientes valores (las macros estn definidos en graphics.h):
#include<graphics.h>
#include<conio.h>
int main(void)
outtext("normal");
outtext("gtica");
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 2 );
outtext("triplex");
outtext("sans serif");
return (0);
Existen siete funciones que permiten manipular la pantalla, y adems con la que se puede crear ventanas de
grficos. Todas estas funciones se muestran a continuacin:
Funcin Propsito
clearviewport() limpia la ventana de grficos
getimage() copia parte de una ventana en el buffer
devuelve el numero de bytes que se necesita
imagesize()
para salvar una imagen
copia el contenido del buffer a la ventana
putimage()
grfica
determina que pagina se vera afectada por
setactivepage()
las rutinas grficas
setviewport() crea una ventana grfica
setvisualpage() determina la pagina que se muestra
void far getimage(int izquierda, int arriba, int derecha, int abajo,
void far imagesize(int izquierda, int arriba, int derecha, int abajo);
void far putimage(int izquierda, int arriba, void far *buf, int op);
void far setviewport(int izquierda, int arriba, int derecha ,int abajo,
int indclip);
En algunos modos de vdeo, existe suficiente memoria en el adaptador de vdeo como para
tener almacenadas al mismo tiempo varias pantallas completas. A la regin de RAM que
contiene la informacin que se muestra en una pantalla se le denomina pagina.
/* Este programa demuestra como se puede mover una imagen grfica usando getimage(),
imagesize() y putimage() */
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
void cuadro(int xinicial, int yinicial, int xfinal, int yfinal, int color);
int main(void)
unsigned tamanio;
void *buf;
controlador = VGA;
modo = VGAMED;
setcolor(RED);
line(20,20,200,200);
setcolor(GREEN);
getch();
/* mueve la imagen */
buf = malloc(tamanio);
if (buf){
getimage(20, 20, 200, 200, buf);
putimage(100,100,buf,COPY_PUT);
putimage(300,50,buf,COPY_PUT);
}
getch();
restorecrtmode();
return (0);
void cuadro(int xincial, int yinicial, int xfinal, int yfinal, int color)
setcolor(color);
Se puede crear ventanas de una manera muy similar a como se crean en modo texto. La
funcin que se utiliza para crear una ventana grfica es setviewport(). Se le pasan las
coordenadas de las esquinas superior izquierda e inferior derecha de la ventana. Si el
parmetro indclip es distinto de cero, entonces la salida que sobrepase los limites de la
ventana grfica se trunca automticamente. En caso contrario la salida puede superar lo
limites. El siguiente programa ilustra la manera de crear una ventana grfica y el recorte de
la salida.
#include<conio.h>
#include<graphics.h>
int main(void)
controlador = VGA;
modo = VGAMED;
setviewport(20,20,200,200,1);
/* intenta dibujar una lnea mas all del borde de la ventana grfica */
setcolor(WHITE);
line(0,100,400,100);
getch();
restorecrtmode();
return (0);
void cuadro(int xinicial, int yinicial, int xfinal, int yfinal, int color)
{
setcolor(color);