Programacion Grafica en C++ - Programación Gráfica SIS-2430

Transcripción

Programacion Grafica en C++ - Programación Gráfica SIS-2430
PROGRAMACIÓN DE GRÁFICOS EN LENGUAJE C
Para producir la imagen de video, la mayoría de los miembros de la familia PC
requiere un adaptador de video. Los adaptadores de video fueron diseñados para el
PCjr, pero inmediatamente se generalizó su uso al resto de las PC’s, a tal punto que se
llega a un nivel como el de VGA (Video Graphics Array) quien claramente ha
demostrado ser el adaptador de video más popular de los últimos tiempos.
Las aplicaciones de software han evolucionado gigantescamente. Si nos
remontamos una o dos décadas en el tiempo veremos que el entorno en el que giraban
los programas era muy limitado y, de poseer capacidades gráficas, estas eran apenas
unos garabatos cuadriculados (monocromo, por supuesto). Hoy en día no nos
imaginamos una aplicación de software sin su adecuado entorno gráfico (La prueba
más concisa: El dominio en el mercado de los “Software for Windows”). Es por este
motivo que todo programador debe tener al menos una noción de programación
gráfica.
Adaptadores de Video y Controladores de Gráficos:
El adaptador de video conecta el ordenador al monitor a través de un chip
llamado controlador de CRT. El adaptador también tiene un conjunto de puertos de
E/S programables, una ROM generadora de caracteres y memoria RAM para
almacenar información del visualizador.
Los generadores de video operan fundamentalmente según dos modos
diferentes, llamados por IBM, modo texto y modo gráfico. El modo texto solo permite
visualizar caracteres (El código ASCII completo), aunque hay quienes programan en
este modo de una forma pseudográfica. El modo gráfico se utiliza principalmente para
producir dibujos complejos, pero puede reproducir caracteres de texto con gran
variedad de formas y tamaños.
Ninguna función gráfica de “C” puede funcionar sin un controlador de gráficos
en memoria. Los controladores de gráficos están contenidos en los archivos .BGI
(Borland Graphics Interface), los cuales deben estar disponibles en el sistema. Los
diversos drivers que Borland provee para esta versión de Turbo C se listan a
continuación:
1. CGA
2. MCGA
3. EGA
4. EGA64 (EGA de 64K)
5. EGAMONO (EGA Monocromática)
6. IBM8514
7. HERCMONO (Hercules)
8. ATT400 (Adaptador de AT&T 6300 PC)
9. VGA
10.PC3270 (IBM 3270)
Es importante destacar que todas las declaraciones de funciones gráficas, el
Turbo C las realiza en un archivo llamado graphics.h que será necesario incluir en el
programa, de la siguiente manera:
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
1
#include <graphics.h>
Inicialización del sistema de gráficos:
Antes de que se pueda usar cualquiera de las funciones gráficas es preciso
colocar el adaptador de video en uno de las modos gráficos usando la función
initgraph(), que tiene la siguiente sintaxis:
void far initgraph (int far *controlador, int far *modo, const char far *camino);
La función initgraph() carga en memoria un controlador de gráficos que
corresponda al número indicado por controlador. Este número está estrechamente
ligado con los 10 enumerados en el tema anterior, pudiendo ser 0 para la opción de
autodetección (cuya macro es: DETECT ). El parámetro modo indica un número
entero que especifica el modo de video usado por las funciones gráficas. Por último se
deberá especificar un camino al controlador si este es distinto al directorio de trabajo.
Los distintos modos, de acuerdo a cada controlador, son los que se muestran
en la siguiente tabla:
Controlador
CGA
MCGA
EGA
EGA64
EGAMONO
HERC
ATT400
VGA
Modo
CGAC0
CGAC1
CGAC2
CGAC3
CGAHI
MCGAC0
MCGAC1
MCGAC2
MCGAC3
MCGAMED
MCGAHI
EGALO
EGAHI
EGA64LO
EGA64HI
EGAMONOHI
HERCMONOHI
ATT400C0
ATT400C1
ATT400C2
ATT400C3
ATT400CMED
ATT400CHI
VGALO
VGAMED
VGAHI
Valor
0
1
2
3
4
0
1
2
3
4
5
0
1
0
1
3
0
0
1
2
3
4
5
0
1
2
Resolución
320 x 200
320 x 200
320 x 200
320 x 200
640 x 200
320 x 200
320 x 200
320 x 200
320 x 200
640 x 200
640 x 480
640 x 200
640 x 350
640 x 200
640 x 350
640 x 350
720 x 348
320 x 200
320 x 200
320 x 200
320 x 200
640 x 200
640 x 200
640 x 200
640 x 350
640 x 480
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
2
PC3270
IBM8514
PC3270HI
IBM8514LO
IBM8514HI
0
0
1
720 x 350
640 x 480
1024 x 768
Para dejar de usar un modo de video gráfico y volver a modo texto, se usa o
bien closegraph() o restorecrtmode(). Sus prototipos son:
void far closegraph (void);
void far restorecrtmode (void);
La diferencia entre ambas estriba principalmente en que la primera descarga
toda la memoria asignada a especificaciones gráficas, mientras que la segunda la deja
intacta para permitir el regreso al modo indicado cuando se encuentre la siguiente
función:
void far setgraphmode (int modo);
Ejemplo: Veamos el siguiente programa que alterna de modo gráfico a texto y
viceversa para mostrar el uso de estas funciones.
#"%$&(')
*+
,-. ! /
! 0
12 ! 345667
! 8
9')8
! 3:;
6 <.= ! >/?8
')@-AB
C2,
.?/D8
<
6C
EF6GH1 I27."KJ9L&(J9$MN&(J;O&(PQ"%J9LR&(J9$9MN&(J;O&S/?8
6C
EF6EF7.. ! T 2 U ! V IC/DWYX9PZ. ! T [6,-U ! T C/?WYX9PQ\2J;1-
T')
] ^I? __ \`/?8
6C
EF6EF7.. ! T 2 U ! V IC/DWYX9P ! T [6C,Ua
EF
.?\2b\2/DP
\c`2
< B
>2>')d&(
EF_e \`/D8
C.?/D8
2
fC,
.D/?8
2 96Ig.\fhi2>
1C,V
B')d&(
EF jj\`/?8
2 96Ig.\c`2
< B
>2 ! ! `>') ] 2^kIg e_ \`/?8
C.?/D8
<
,-@
.')/?8
<
6C
EF6GH1 I27."KJ9L&(J9$MN&(J;O&(PQ"%J9LR&(J9$9MN&(J;O&S/?8
6C
EF6EF7.. ! T 2 U ! V IC/DWYX9PZ. ! T [6,-U ! T C/?WYX9PQ\5lm
C>
n')@
] ^I? __ \`/?8
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
3
6C
EF6EF7.. ! T 2 U ! V IC/DWYX9P ! T [6C,Ua
EF
.?\2b\2/DP
B
>2o< g__ \`/?8
C.?/D8
\c`2
< p
, .?/
0
9"%C `AB*TJ;&(J9"+&(8
9')8
9"% J9228
C2.=q"K92 @2PQ=q')PQ\`\`/?8
"%@ J922An2
; C.?/D8
/D8
Ig."% J92RrfAn2sutv/?0
2 6Ig.?\b>2 BJ92gwxS<j\2PQ
22,d<."%@ J922/
Ey C.zV/?8
p
p
"%$&(')@
*T
,.?/?8
;
2.D/?8
Cuando se deja al sistema de gráficos de Turbo C que establezca el modo de
video, el programa necesita alguna manera de conocer el entorno. La función
getviewsettings() devuelve las dimensiones de la ventana y getmaxcolor() devuelve el
número de colores permitido en el modo de video aplicable.
La sintaxis es la siguiente:
void far getviewsettings (struct viewporttype far *info );
int far getmaxcolor (void);
Se ve claramente que la función getviewsettings() devuelve el entorno de
trabajo a través de una estructura pasada por referencia. La estructura viewporttype
se define en graphics.h como se muestra a continuación:
struct viewporttype {
int left, top, right, bottom;
int clip;
};
Los campos left, top, right y bottom contienen las coordenadas de los
extremos de la ventana. Cuando clip == 0 no existe salida que sobrepase los límites de
la ventana. Si este es distinto de cero, se realizará corte manual para no sobrepasar los
límites.
Las funciones básicas:
Las funciones elementales en cualquier lenguaje para el trazado de gráficos en
general, son las que dibujan: puntos, líneas y círculos. En Turbo C estas funciones son
llamadas putpixel(), line() y circle() respectivamente. Sus prototipos son:
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
4
void far putpixel (int x, int y, int c);
void far line (int x_ini, int y_ini, int x_fin, int y_fin);
void far circle (int x, int y, int r);
La función putpixel() coloca un pixel de color c en la posición dada por x e
y.
La función line() dibuja una línea desde la posición ( x_ini , y_ini ) hasta la
posición especificada por ( x_fin , y_fin ) en el color preestablecido.
La función circle() dibuja un circulo de radio r centrado en ( x , y ).
Ejemplo: El siguiente programa muestra principalmente el uso de putpixel() y
circle(). Su implementación se ha pensado para que sirva también para mostrar el
funcionamiento de funciones como outtextxy(), rectangle(), bar() (y las funciones
elementales de seteo de parámetros gráficos) que serán analizadas más adelante.
[T 2T @
Ig J;{Z"
|;E}z;[
~')kEy"% 5<P_')E;O@P_')kEFR8
! #"% <. ! @/?8
! #c`C<. ! /?8
! #c`9<.? /?8
! 4lm
C.D C/D8
! 4{NCkC<.? 9PQ`€Y/?8
! #Z
. ! /?8
, .?/
0
9"%C `AB*TJ;&(J9"+&(8
9') ] I? 8
C2.=q"K92 @2PQ=q') ] 2kIg PZ\\`/?8
')kEy"% 5TAn
,-kEy 2.?/‚ƒz;8
')kEFOƒAn
,-kEFEy.D/?8
')kEF-AB
,E;7.?/?8
3n .„z;/0
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
5
c`C<.?/D8
"% 2 <.?/?8
p
p
#"% <. ! @/
! 0
9')kEy$8
lm
.zV/?8
{N;.z;P_\c`2
< B
ƒ2ƒ,[ .?J;{Z"…2o{ 2/?\/?8
')kEy$#An')kEF-WSz;|98
3n .r5tN[ C.?//D0
<
C 2.,.')kEy"% 5TU@zV/‚ƒzV/?8
.,.?')kEFO/?PQ2,.?')kEFR/?PQ2,.?')kEy$//D8
p
c`<.„z;/D8
p
#c`C<. ! /
! 0
9}VAƒz;†9‡9ˆ98
9 P‰GHP‰EyP‰7PZP‰34PQ 8
12 ! 345667
! 8
lm
.|:/?8
! 3:;
6 <.= ! >/?8
BA ! T [6,ŠU ! V 8
3‹A ! T 2 ~U ! T I28
I?2.GHA|98 GHX98 GH‚‚B/0
<2.V/D8
Ig. A|:8Z ‡9|9|9|Œ8Q‚‚F/?0
EŒAzV‚B2,.3ŽUzV/?8
7nAzV‚B2@,-.BUzV/?8
`AB.G/u
Ey
.E9PN7n/w‰2@,-.'4Ey"K 5T/?8
I?..GH/u. `AAn,.?')kEy"% 5<//wQzq/C E9
.EyP‰7P
.eGH/u|nwN 2/?8
p
p
p
c`<.?|9/D8
#c`9<.? /
! 0
1 ,u<T‘_’}An\c`2
< B
>2>,[ `.?J;{Z"…2o{Z 2/D\28
98
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
6
p
{N;. PQ,d;>/?8
AB
.?/?8
Ig.J;{Z"…AAn/?0
<
2.?/D8
Ey C.zV/?8
p
Ig.|:AAn/?0
An
.D/?8
p
4lm
C. ~;/
! 0
<
2.'4Ey"K 5TUzV/?8
Ig.r5T/0
<
! 3nfC.|9PQ|9PZ'4EFOWYX9Uz;PQ')kEFRP“zq/D8
Q2
.?/D8
<
! 3nfC.z;P“z;PZ'4EFOWYX9U”X9PQ')kEFRUz;P“zq/D8
! 3nfC.?/D8
p
;
0
<
! 3nfC.')kEFOWYX9PQ|9PZ')kEFOPQ')E;RP•zV/?8
Q2
.?/D8
<
! 3nfC.')kEFOWYX9‚z;P•z;PQ')kEFOUz;PZ'4EFUz;P•zV/?8
! 3nfC.?/D8
p
p
4{NCkC<. <PQ`€Y,d<ƒ/
! 0
98
<
2.'4Ey"K 5TUzV/?8
<
6C
EF61–7 .{Z'—hi˜™˜1MZšFsuLR&(PZbsu$› œFMZ*T› $P‰4/D8
<
6C
EF6GH1 I27."KJ9L&(J9$MN&(J;O&(P‰&(sucžMN&(J;O&S/?8
<
167 .{Zsu˜<› *RMZ˜<› L+J9PZ|9PQLTsu$'—MNŸ › *R&(bƒ/?8
<
6Ig 167 .J9')cž&YMš;› ˜<˜™PZ|:/?8
BA:
EF
9.\2b\`/?8
Ig.r5T/0
<
! 3nfC.|9PQ|9PZ'4EFOWYX9Uz;PQ')kEFRP“zq/D8
[.|9PZ')kEFRU”.D‚/?PQ')kEFOWYX9Uz;PZ'4EF-/D8
2
.|9PQ')kEFRU”.?‚/?PQ')kEFOWYX9Uz;PZ')kEF-/?8
–
EF6EF7.')kEFOWDPZ'4EFU”.?‚X9/DPZ,d<ƒ/?8
<
! 3nfC.z;P“z;PZ'4EFOWYX9U”X9PQ')kEFRU”.?‚‡9/?P“zq/D8
p
;
0
<
! 3nfC.')kEFOWYX9PQ|9PZ')kEFOPQ')E;RP•zV/?8
[.')E;O@WYX9PQ')kEFRU”.?‚/?PQ')kEFOPZ')kEF-/?8
2
.|9PQ')kEFRU”.?‚/?PQ')kEFOWYX9PZ')kEF-/?8
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
7
–
EF6EF7.')kEFOWDPZ'4EFU”.?‚X9/DPZ,d<ƒ/?8
p
<
! 3nfC.')kEFOWYX9‚z;P•z;PQ')kEFOUz;PZ'4EFU”.?‚‡9/DP•zV/?8
p
< 6C
EF61–7 .*TJ9š¡h%¢˜1&YMZšFsuLR&(PZbsu$› œFMZ*T› $P“zq/D8
#Z
. ! /
! 0
12 ! 345667
! 8
p
<
2.'4Ey"K 5TUzV/?8
<
167 .{Zsu˜<› *RMZ˜<› L+J9PZ|9PQLTsu$'—MNŸ › *R&(bƒ/?8
! 3:;
6 <.= ! >/?8
C .|9PZ|9P ! V 9U ! T I2P ! T [6,-U ! T C>/?8
También existe otro par de funciones para facilitar el trazado de líneas:
void far linerel (int dx, int dy);
Este comando es útil cuando trabajamos en forma relativa. Su misión es trazar
una línea tomando como referencia la posición actual y, por medio de los parámetros
dx y dy, introducimos un incremento positivo o negativo en la coordenada final.
Sino tenemos:
void far lineto (int x, int y);
Que también es utilizada para generar líneas, solo que ahora introducimos la
coordenada final en forma absoluta mediante los parámetros x e y.
Ejemplo: A continuación se verá un programa que, ejecutandolo paso a paso, nos
mostrará el funcionamiento sutilmente distinto entre ambas funciones, aunque la
disposición impuesta hace que con ambas podamos hacer lo mismo.
,-k@ @
Ig '—h+O@c(&Y{
z;‡
12~c(&Y{d0
9}EyP‰78
p68
12~c(&Y{dT‘_'ŒhTOcž&Y{Z’–P_T‘H'—hTOcž&Y{Z‚z;’C‘H'—h+O@c(&Y{‚z;’68
! #˜< &(*T
,.?[ /?8
! #˜< $
*T
,.?[ /?8
! #c`2,-
2<.?@[ /D8
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
8
#, . ! #/
! 0
9 ] 2*+2 ! An*+J;&(J9"+&(8
9 ] 2')@
8
9}Eyk;P‰7<8
[ $
8
C2.= ] *T ! 2PQ= ] 2'4
PZ\\`/?8
Ck<
2k .=@Eyk<PQ=@7<>/?8
$
BAB.?[ /Eyk;>W£.?[ /7<8
˜™ &(*T
,.?$
/D8
C.?/D8
! .?/D8
˜™ $
*+
,-.D$
/?8
C.?/D8
p
;
2.D/?8
#c`2,-
2<.[ $
F/
! 0
12 ! 345667
! 8
9 P‰GHPQtNPZ PZP‰34P‰EyP‰7PZtN8
92PQPZk;8
[ ¤2}<8
! 3:;
6 <.= ! >/?8
BA ! T [6,ŠU ! T 8
3‹A ! T 2 ŠU ! V IC8
EyAi3ŽW£X98
7ABnW£X98
`AB.?BUˆ9|9/W.D$
;€X9/D8
<AB¥9¦9|ŒW£'—h+Ocž&Y{Z8
ƒAB|98
I?2. A|:8Q '—hTOcž&Y{§8Q‚‚F/0
2}TAn.D[ /?>€'ŒMc›(WSz;ˆ9| |98
T‘_ ’C EŒAiEy‚n.? C/?.<.?;/€£`/D8
T‘_ ’C 7nA:7U.? 9/?.< .?;/€£`€£$
F/?8
>‚An<8
WYۥ{Z C
€YW
p
I?2.GHAzV8‰GHA'—hTOcž&Y{§8NG‚‚n/0
Ig. A|9P_ A|:8Z '—hTOcž&Y{§8Z ‚‚P_ ‚AGy/0
p
tNA xd'ŒhTOcž&Y{Z8
tNA.? UaGH/x§'—hTOcž&Y{Z8
T‘_ ’C‘ GHUz;’ EŒAnT‘_tN’ EŒUT‘H.? /?.?tN/„w .?tN/?’ Ey8
T‘_ ’C‘ GHUz;’ 74ABT‘_tN’ 7nUT‘_.? /?`.?tN/„w .?tN/?’ 78
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
9
T‘_'ŒhTOcž&Y{Z’C‘ GHUz;’ EŒAnT‘H|9’C EŒUV‘H'—h+O@c(&Y{UaG’C Ey8
T‘_'ŒhTOcž&Y{Z’C‘ GHUz;’ 7nAnT‘_|9’ 7nUT‘H'—hTOcž&Y{ZUaGH’ 78
p
2 .eEyP 7Pe/?8
p
#˜< &(*T
,.[ 2>/
! 0
9 P‰GH8
p
c`2,
C<.2>/?8
I?2. A|:8Q '—hTOcž&Y{§8Q‚‚F/0
Ig.GHAF8‰GH'—h+O@c(&Y{d8Q‚‚9G9/0
, ! C.?T‘H ’ E9PZT‘_ ’C 7/?8
.?T‘ G’C EyPQT‘ G’C 7/?8
p
p
#˜< $
*T
,.?[ /
! 0
9 P‰GH8
c`2,
C<.?2/?8
I?2. A|:8Q A'—hTOcž&Y{§8Z‚‚F/0
, ! C.DV‘H|9’C EyPQT‘_|9’ 7/?8
Ig.GHA|:8NGA'ŒhTOcž&Y{§8Z‚‚Gy/0
.?@V‘ GH’‘_ ’C EyPQT‘ G’C‘H ’ 7/?8
p
p
p
Lógicamente se intuye que es necesario contar con una función que me
establezca el color de dibujo aplicable al usar line() o circle() (o muchas más). Por ello
surge:
void far setcolor (int color);
El valor de color tiene que estar comprendido en el rango válido para el modo
de gráficos actual. Esto es entre 0 y getmaxcolor().
Funciones para el tratamiento de figuras geométricas:
La siguiente es una síntesis de las funciones más usadas para todo tipo de
figuras geométricas. Como se puede apreciar, son de funcionemiento bastante
intuitivo.
void far rectangle (int left, int top, int right, int bottom);
Realiza un rectángulo con los límites establecidos.
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
10
void far arc (int x, int y, int StartAngle, int EndAngle, int Radio);
Realiza un arco, donde ( x , y ) son las coordenadas del centro, StartAngle y
EndAngle nos da el ángulo (en radianes) donde comienza o termina respectivamente
de trazar el arco, y Radio fija el valor del radio.
void far bar (int left, int top, int right, int bottom);
void far bar3d (int left, int top, int right, int bottom, int depth, int topflag);
Usados para la creación de gráficos estadísticos.
void far
RadioY);
ellipse (int x, int y, int StartAngle, int EndAngle, int RadioX, int
Ellipse con centro en ( x , y ); valores de radio máximo y mínimo ( RadioX e
RadioY alternativamente). StartAngle y EndAngle nos da la posibilidad de no generar
la ellipse completa.
void far sector (int x, int y, int StartAngle, int EndAngle, int RadioX, int RadioY);
Dibuja y rellena una porción elíptica.
Funciones para el tratamiento de áreas:
Se puede rellenar cualquier figura cerrada usando la función floodfill() cuya
sintaxis es:
void far floodfill (int x, int y, int ColorBorde);
Al usar esta función para el relleno de figuras cerradas, llámese por las
coordenadas de un punto dentro de la figura y el color de las líneas que constituyen la
figura (su contorno). Está demás aclarar que deberá tratarse de una figura cerrada.
Usando setfillstyle() se puede determinar la forma usada para el relleno.
void far setfillstyle (int modelo, int color);
Los valores para modelo y sus macros equivalentes se listan a continuación:
Macros
EMPTY_FILL
SOLID_FILL
LINE_FILL
LTSLASH_FILL
SLASH_FILL
BKSLASH_FILL
LTBKSLASH_FILL
HATCH_FILL
XHATCH_FILL
Valor
0
1
2
3
4
5
6
7
8
Significado
Relleno con color de fondo
Relleno con textura uniforme
Relleno -------------------Relleno ////////////////////////
Relleno //////////////////////// con líneas gruesas
Relleno \\\\\\\\\\\\\\\\\\\\\\\\ con líneas gruesas
Relleno \\\\\\\\\\\\\\\\\\\\\\\\
Relleno con espaciado ligero
Relleno con espaciado denso
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
11
INTERLEAVE_FILL
WIDE_DOT_FILL
CLOSE_DOT_FILL
USER_FILL
9
10
11
12
Relleno con líneas entrecortadas
Relleno punteado con gran espaciado
Relleno punteado con poco espaciado
Relleno definido por el usuario
Salida de texto en modo gráfico:
Aunque las funciones estándares de texto de Turbo C, tales como la printf(),
pueden usarse en la mayoría de los modos gráficos, no son la alternativa más flexible.
Para aprovechar al máximo el entorno gráfico de Turbo C será necesario usar las
funciones de salida de texto en modo gráfico, descritas a continuación:
void far outtext (char *cadena);
void far outtextxy (int x, int y, char *cadena);
Estas funciones sacan la cadena (apuntada por el puntero) a la ventana gráfica
predefinida. Las principales ventajas de usar outtext() sobre la de usar printf() son sus
posibilidades en el manejo de strings en diferentes tipos de caracteres, tamaños,
direcciones o resolución en las posiciones. También es una ventaja la posibilidad de
cortar la salida que desbordaría la ventana. Por el contrario, printf() no puede cortar la
salida.
void far settextstyle (int tipo, int direccion, int tamaño);
El parámetro tipo determina el juego de caracteres a ser usados. Por omisión,
es un tipo “mapa de 8x8 bits”. Se puede dar a tipo uno de los siguientes valores:
Tipo
DEFAULT_FONT
TRIPLEX_FONT
SMALL_FONT
SANS_SERIF_FONT
GOTHIC_FONT
Valor
0
1
2
3
4
Significado
Tipo mapa de 8x8 bits
Letras Grandes
Letras pequeñas
Tipo Sans Serif
Letra Gótica
La dirección en la que se visualiza el texto, izquierda a derecha o de abajo a
arriba, se determina por el valor de dirección que puede ser HORIZ_DIR o bien
VERT_DIR, correspondiendo cada uno de estos a 0 o 1 respectivamente.
El parámetro tamaño es un multiplicador que aumenta el tamaño del caracter.
Su rango válido es de 0 a 10.
Al igual que lo hacíamos con las ventanas gráficas, para obtener información
respecto a las especificaciones de texto en modo gráfico, puede usarse una función
cuyo argumento es una estructura pasada por referencia.
void far gettextsettings (struct textsettingstype *TextInfo);
Esta estructura ha sido definida en graphics.h de la siguiente manera:
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
12
struct textsettingstype {
int font;
int direction;
int charsize;
int horiz;
int vert;
};
Cambio de estilo de línea:
Turbo C permite cambiar la forma en la que se dibuja una línea. Todas las
líneas son sólidas por omisión, pero mediante la especificación correcta esta puede ser
de puntos, de trazos, de puntos y trazos contiguos o personalizado. Para efectuar estos
cambios usaremos la función:
void far setlinestyle (int estilo, unsigned modelo, int ancho);
A continuación se detallan los posibles valores del parámetro estilo:
Valor
SOLID_LINE
DOTTED_LINE
CENTER_LINE
DASHED_LINE
USERBIT_LINE
Significado
Línea continua
Línea de puntos
Eje de simetría
Línea de trazos
Línea definida por el usuario
Si se desea un estilo personalizado mediante este último valor, la forma de la
línea se introduce por el parámetro modelo como si se tratase de un mapa de bits. Por
ejemplo si (estilo==4)&&(modelo==0x1234), cada vez que tracemos una línea tendrá
una forma que se corresponderá a 0001001000110100 donde los ceros son pixels
apagados y los unos son pixels prendidos.
El valor del ancho podrá ser NORM_WIDTH o bien THICK_WIDTH siendo
el primero una forma de especificar un espesor de 1 pixel, y el segundo un espesor de 3
pixels.
Funciones que trabajan con porciones de pantalla:
Aquí aparece una filosofía distinta de trabajo. Ya no se trata de dibujar con las
nociones básicas de geometría (como se venía haciendo), sino de aprovechar el manejo
de la memoria de video como un complemento útil a las funciones antes vistas para
evitar la redundancia en el dibujo.
La función getimage() se usa para copiar una región de la ventana de gráficos
en una memoria intermedia. La función putimage() pone el contenido de una porción
de memoria en la pantalla. La sintaxis es la siguiente:
void far getimage (int left, int top, int right, int bottom, void far *buffer);
void far putimage (int left, int top, void far *buffer, int op);
La función getimage() copia el contenido de una porción rectangular de la
pantalla definida por sus coordenadas en la memoria apuntada por el puntero buffer.
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
13
Se usa putimage() para visualizar una porción de pantalla contenida en memoria y
apuntada por buffer. Mediante el parámetro op se determina la forma en la que se
escribirá en pantalla pudiendo este tomar alguno de los siguientes valores:
Nombre
COPY_PUT
XOR_PUT
OR_PUT
AND_PUT
NOT_PUT
Valor
0
1
2
3
4
Significado
Sobreescrbir el destino
OR-Exclusivo con destino
OR con destino
AND con destino
Invertir la imagen fuente
El tamaño de la memoria intermedia, en bytes, para una región determinada se
proporciona por la función imagesize(). Se debe usar esta función en lugar de intentar
calcular manualmente el espacio necesario, ya que imagesize() proporciona el valor
correcto con independencia del modo de video que esté en uso. La sintaxis es la
siguiente:
unsigned far imagesize (int left, int top, int right, int bottom);
Cabe aclarar que estas funciones que manejan porciones de pantalla
directamente de la RAM de video, lo hacen de una forma similar al funcionamiento de
la memcpy() definida en mem.h, solo que ahora uno de los punteros lo prefijamos de
acuerdo al valor establecido por el hardware en uso. Esto le da cierta potencialidad a
estas funciones aunque para ello tenemos que acercarnos un poco más al nivel de
máquina.
Ejemplo: Como intento simplificado de hacer un protector de pantalla, veremos el
manejo de las funciones mencionadas en un programa que mueve una porción de
pantalla a travez de esta.
,-
,¨ [T @
Ig suL z
@
Ig sušFš©|
@
Ig ')kEycž6
¦
@
Ig *T
2O.EyP 3nP_ P_`/..?.? /?‚.Ey/?‚.3n/?Uz;/B.?//u..?2/?U”.D /?U”.3n/?‚zV/w‰.?.EŒAn|9/u|nw
E9/?8
@
Ig *T
2R.e7PeP Pe[/..?./?‚.7/?‚.?/?Uz;/B.?[//u..?[/?U”./?U”.?/?‚zV/wN.?.e74AB|9/u|nw
7/D8
12~c(&Y{d0
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
14
9}EyP‰78
p68
#, . ! #/
! 0
! #c` <. ! #/?8
! #› ,-
. ! #/?8
9}Eyk;P‰7<8
9 ] 2*+2 ! An*+J;&(J9"+&(P ] ')
8
C2.= ] *T ! 2PQ= ] 2'4
PZ\u\/?8
! .?/D8
c` ;.D/?8
C.?/D8
› ,
.?/?8
;
2.D/?8
p
#c` <. ! #/
! 0
! #Z
. ! #/?8
12~cž&Y{§ 7@‘Q'4Eyc(–T’–8
9 8
9')kEy"% f<PZ 28
Q2
.D/?8
')kEy"% 5TAn
,-kEy 2.?/‚ƒz;8
3n .r5tN[ C.?//D0
AzV‚B2@,-.'4Ey"K 5<UzV/?8
<
–I? 1–7 .2,.„z;|9/?PQ `/?8
<
C 2. `/?8
Ig. A|:8Z .?')kEycž6;Uz;/8Q ‚‚B/?0
7@‘_ ’C EŒAB2,.
,EFE9.?//?8
7@‘_ ’C 7nAB2@,-.
,-kEF7.?//D8
p
p
p
7@‘H ’ EŒAB 7@‘H|9’C Ey8
7@‘H ’ 7nAB 7@‘–z;’ 78
Ig 7.')E9cž–<PQ.? }Ig`€Y/? 7n/?8
#› ,
. ! #/
! 0
1 }Ÿ bƒAƒz;|9|98
1 cž&SA:|98
12~cž&Y{§98
12 ! 345667
! 8
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
15
9}EyP‰7PZ}E9PZ}78
9}<PZ E9PZ 7PQ fEyPQ 57P‰3nPZPQA‡9|98
! #€Yc` PZ€Y'4
,- 8
! 3:;
6 <.= ! >/?8
EŒAB. ! T 2 CU ! T IC/?WYX:UŸ b8
7nAB. ! T [6C,U ! T /?WYX:U9ٻbWYX98
3‹An.D 5EŒAB Ey‚Ÿªb€YX9/U Ey8
BAn.D 57nAB 7‚Ÿ b/U 78
c`C ƒAB, .<A ,
< «(
.? EyPZ 7PZ 5EyPQ f7//?8
')
, ƒAB, .T/?8
C ,
. EyPQ 7PQ 5E9PZ 57PQc` /?8
,
,7.'4
,- PZc PN<€D< «(
I?.< «(
MNC//D8
EyA E98N7A 78
3n -.rftN[ .?//0
9 ,
.E9PN7PQc`9 PQ"%sucž`MZc`¢&
0
}EŒAB.?2,.Ÿ b/x§X9/uUa34WYªwC3nWY8
EŒAn*+
[email protected]‚AEy/?P‰34P ! T I2P ! T 2 ~/D8
}7nAn.D2@,-.eŸ b/xdX9/uU”WYªwNWY8
7 An*+
92..7‚A7/?PZP ! V P ! T [6C,¤/?8
n
pQ3n .EyAA‰ EŒ=q=7AA‰ 74/D8
C ,-
.EyPN7P‰Ey‚3nPN7‚PQc` >/?8
9 ,
.E9PN7PQ')
,2 PQ"%sucž`MZc`¢&S/?8
,
,7.')
, PZc`C P‰<€D< «(
Ig.e; «(
MNC//?8
7.cž&S/?8
p
p
I?2
.')
,2 ƒ/?8
I?2
.c`C ƒ/?8
#Z
. ! #/
! 0
12 ! 345667
! 8
<
2.
,-kEy 2.?/U2,.
,E9 2.D///?8
p
<
167 .{Zsu˜<› *RMZ˜<› L+J9PZ|9PQLTsu$'—MNŸ › *R&(bƒ/?8
! 3:;
6 <.= ! >/?8
C .|9PZ|9P ! V 9U ! T I2P ! T [6,-U ! T C>/?8
INFORMÁTICA II - Ayte. Mauricio Varea - Ing. Oscar Nasisi - Ing. Carlos Gil
16

Documentos relacionados