# U niversidad Autónoma Metropolitana Unidad: 'División: /Carrera : Materia: YTít u I o : ""Fecha: 4lumno: iztapaiapa Ciencias Básicas e Ingeniería Licenciatura en Compu taci ó n Proyecto de Investigación I I Ambiente Gráfico para Programación Marzo de 1998 Lázaro Islas Saavedra Matrícula: 84331 704 Asesor: ing. Jorge Lozano Moreno
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
#
U niversidad Autónoma Metropolitana
Unidad:
'División:
/Carrera :
Materia:
YTít u I o :
""Fecha:
4lumno:
iztapaiapa
Ciencias Básicas e Ingeniería
Lice n ci at u ra en Com pu taci ó n
Proyecto de Investigación I I
Ambiente Gráfico para Programación
Marzo de 1998
Lázaro Islas Saavedra
Matrícula: 84331 704
Asesor: ing. Jorge Lozano Moreno
Turbo Power SofhaPe.
UNIVERSIDAD AUTONOMA METROPOLITANA
Casa abierta al tiempo
LICENCIATURA EN COMPUTACION
M A N U A L T É C N I C C O
Elaborado p o r :
Ale jandro Garcia Teroba.
Lazaro I s l a s Saavedra.
Agosto de 1991.
m u d Técnico Indico
INDICE
Introducción. -
Prologo.
Datos generales de la unidad gráfica
¿Que es UniGraf?
Gr ConIODrv
Windows
Menus
Editor
Requerimientos
Objetivos del proyecto
4
5
5
6
6
7
7
8
9
Metodología seguida (Diseño)
Turbo Profesinal
Diseño de la interfaz gráfica
Implementación de las rutinas
10
12
16
2
nanual Técnico Indi ce
Código fuente de las rutinas. 17
Conclusiones y análisis de resultados. 1 8
Bibliografía.
3
h n u a l Técnico introducci6n
CAPITULO 1 INTRODUCCION
PROLOO0 . Las gráficas por computadora es uno de los campos más
interesantes y que crece más rápidamente dentro de la computación.
Algunos de los sistemas de computación más complejos que se usan
hoy en día están diseñados para la generación de decplieges
gráf icos .
El uso de figuras es un medio eficaz de comunicación, y la
capacidad de interactuar en forma gráfica con una computadora, es
una de las alternativas más apreciadas por aquellos que manejan
estas herramientas. Las opciones de entrada a muchos programas de
computadora se diseñan como un conjunto de fconos, símbolos
gráficos que se parecen a la opción de procesamiento que deben
representar. Los usuarios seleccionan opciones de procesamiento
señalando el icono adecuado. La ventaja de estos sistemas, es
que l o s iconos pueden ocupar menos espacio en la pantalla que
la descripción textual correspondiente de las funciones y puede
entenderse más rápidamente si estos estan bien diseñados.
Wanual Técnico
1 . 1 DATOS GENERALES D E LA UNIDAD GRÁFICA.
Una interfaz gráfica para el desarrollo de sistemas, es un
conjunto de utilerias que nos ayudarán a producir procesos con
capacidades gráficas de manera fácil y rápida, ademas de optimizar
el uso los recursos de entrada y salida de datos de la computadora
como son: Teclado, ratón, pantalla e impresora.
¿QUE ES UNIGRAF 1 . 0 3
UniGraf es un conjunto de rutinas basadas en GRAPHICS, que es
el conjunto de primitivas gráficas utilizadas en los compiladores
de TURBO C y TURBO PASCAL. Estas a su vez son rutinas estandares
del conjunto GKS (Graphics Kernel System), que es el estandar
aceptado por la IS0 (International Standards Organization) y por
la ANSI (American National Standards Institute) como el conjunto
de primitivas gráficas.
La herramienta desarrollada, fue inicialmente diseñada para
ser utilizada como funciones de librería en el código fuente de
los sistemas. Éstos deberán ser codificados en el lenguaje C o
Pascal. Para hacer uso de la unidad gráfica, s e recomienda el
uso de los compiladores T u r b o C 2.0 o posterior o Turbo Pascal 5 . 0
ya que las rutinas se implementaxon basandose en estos compila-
dores.
5
Introducción
UniGraf se divide en cuatro módulos, clasificados deacuerdo
a las tareas que realizan cada uno de ellos. Éstos módulos
son: GrConIODrv, Windows, Menus, Editor.
GrConIODrv. Este módulo es una extencion de las librerías
conio y s tdio de C y es necesaria para el uso de la unidad. E s
aquí donde se verifica el equipo existente y se adaptan las
librerías para su portabilidad entre diferentes equipos. En este
módulo se incluyen las rutinas para el manejo de: teclado, ratón,
pantalla e impresora.
Windows. Este módulo contiene un conjunto de rutinas que le
permiten al usuario un manejo más amigable de la presentación
en pantalla, ya que se pueden hacer desplegados en una sección
de la pantalla conservando la información que se encontraba
anteriormente y recuperar dicha información posteriormente. Esto
permite que se puedan manejar más datos de los que pueden
presentar en una sola pantalla. Lo anterior se logra mediante el
uso de un TDA (Tipo de datos abstractos) al que hemos llamado
Ventana (Window). El uso de ventanas simula la sobreposición de
los datos a la pantalla actual (Apertura de la ventana) y el
retiro de estos lo cual regresa la pantalla a su forma original
(Cierre de la ventana).
6
introduccibn
Menfie. En este módulo se incluyen rutinas que facilitan la
construcción de menús interactivos, esto es, que mediante el uso
de pocas lineas de código, se puede hacer que el sistema desarro-
llado cuente con una forma de tomar de decisiones controlada
por el usuario final, ésta se basa en la introducción de la
opción por medio del manejo del ratón o las teclas de cursor.
Dentro de la opción podrán relizarse una o más instrucciones.
Editor. En éste módulo se incluyen rutinas para el manejo
del desplegado y captura del texto del sistema a desarrollar.
El módulo permite la manipulacion de los atributos del texto
como son: Color, Tamaño, Estilo o Tipo de datos. La entrada de
datos se puede hacer mediente el teclado o el raton, así mismo
la salida podra ser a la pantalla o la impresora.
7
Manual Técnico rnrroducci 6x1
REQWXIMIENTOS . UniGrad, ha sido construida con la finalidad de que funcione
con cualquier tipo de computadora compatible con IBM. La
principal preocupaci6n que se tuvo en su diseño, fue hacer una
herramienta de desarrollo autoconfigurable a tiempo de ejecución,
lo anterior significa que un sistema desarrollado con cierto
equipo de hardware deber6 funcionar correctamente cuando este
migre a un equipo diferente. Sin embargo se deben tener algunas
consideraciones para lograr un mejor rendimiento de los sistemas
desarrollados, entre lo que se recomienda el parametrizar las
coordenadas, los colores y los estilos utilizados.
Aun cuando UniGraf sea una herramienta autoconfigurable,
existe un mínimo equipo requerido para su correcto funciona-
miento, el cual se cita a continuacion:
- Un computador compatible con IBM PC/XT/AT o PS/2
- Una targeta gráfica CGA/EGA/VGA o Hercules
- Disco duro.
- Cornpilador C o Pascal.
- 640kb de memoria como mínimo.
El quip0 que se recomienda para obtener mejores resultados,
es un sistema de computacion AT con memoria extendida, disco
duro de rápido acceso y targeta de video de a l t a resolucion
entre las que se recomienda una SuperVGA, IBM8514, o Hercules
en color.
m u d Técnico
OBJETIVOS DE LA UNIDAD GRÁFICA.
Como ya se ha explicado con anterioridad, la unidad gráfica
tiene como objetivos principales, proveer al programador de una
herramienta para el desarollo de sistemas con capacidades
gráficas, ésta debera ser fácil de usar ademas de optimizar el
uso de los recursos del sistema.
Uno de los objetivos más importantes del proyecto, fue
crear un conjunto de rutinas independientes del hardware, que
se autoconfiguraran al tiempo de ejecución de manera transpa-
rente al programador sin que por ello se pierdiera la sencillez
de programaci6n o el alcance y efectividad de la unidad.
Cabe mencionar que siempre se tuvo en mente el tratar de
proporcionar un abmiente agradable como resultado del uso de
las rutinas de la unidad, Para lo cual se diseñaron las
presentaciones tomando el mayor cuidado posible, haciendo
siempre consultas a diferentes personas a las cuales les estoy
agradecido por su valiosa participacion.
9
uanusl TBcniM Diseño.
CAPITULO 2 METODOLOGIA DE IMPLEMENTACION. -
Existen muchos factores que se incluyen en el diseño de una
interfaz del usuario. Ademas de las operaciones especificas que
se pondrán a disposición del usuario, debemos considerar cómo se
organizarán los menús, cómo responderá la unidad a la entrada
de datos y a los errores generados, cómo se organizará el des-
pliegue de salida, y como se documentará y explicará el uso de
la unidad.
Para simplificar el trabajo a relizar, se tomará como base
una herramienta ya existente, que ofrece todas las posibilidades
citadas anteriormente con la desventaja de que estas han sido
implementadas en modo texto, esto es que solo se cuenta con
desplieges de caracteres gráfico pre-establesidos. Debe conside-
se el echo de que el tomar como base un paquete ya existente, no
minimísa el trabajo ya que solo se tomará la estructura de este,
correspondiendole a los desarrolladores, el analizar, depurar,
diseñar e implemetar todas aquellas funciones y procedimientos
que se incluyan.
TURBO PROFETIONAL.
Turbo Profetional es un conjunto de rutinas que se usan como
librerías, para el manejo de los recursos del sistema. Esta
implementado para ser usado en unión a las rutinas del compilador
TURBO PASCAL 4.0 o posterior, se divide en cinco módulos, los
cuales se describen a continuación.
10
nanuai Tbcnico Diseño.
TPCRT. Es un conjunto de rutinas que substituyen a la unidad
CRT de Turbo Pascal, en esta se hace el manejo de los recursos
del sistema entre los que se encuentran: El video, teclado, ratón
memoria, disco duro, etc.
TPSCREEN. Proporciona el uso de la memoria normal como una
extención de la pantalla, lo que nos proporciona un manejo
bastante amplio de este recurso.
TPWINDOWS. Permite el uso del TDA Ventana el cual fue des-
crito en la introducción de este manual.
TPMENTJ. Este módulo provee un conjunto de utilerias para la
construcci6n de menus interactivos al estilo LOTUS o BORLAND.
TPEDIT. Es un conjunto de rutinas que nos permiten la mani-
pulación de datos cómo son: La entrada de datos desde el teclado,
la entrada de datos residentes en la pantalla, la salida de
datos a la pantalla, etc.
Cuando se eligio a Turbo Profetional cómo base del proyecto
se penso en aumentar los alcances de la unidad, para lo cual se
hizo un minucioso análisis de este para con ello incluir lo
mejor de este en nuestra unidad. De los resultados obtenidos,
s e llego al siguiente esquema de lo que debería ser UniGraf 1 . 0
11
Diseña.
DISEÑO DE LA INTERFAZ GRÁFICA.
Modelo del usuario.- El modelo del usuario, ofrece la defini- ción de los conceptos impicados en la unidad gráfica. Este modelo
ayuda al usuario a entender la forma en la que opera el paquete
en terminos de aplicaciones. Explica al usuario que tipos de
objetos pueden desplegarse y como pueden manipularse.
Dentro del modelo del usuario de la unidad gráfica contamos
con diferentes objetos manipulables que fuerón diseñados tomando
en cuenta los paquetes existente en el mercado, los objetos se
muestran a continuación:
nanual TOcnico Diseño.
Este es un ejemplo del tipo de ventana que
se puede desplegar con la unidad gráfica, los
atributos que pueden se modificados son:
- Tipo de marco (con marco o sin marco) - Tamaño del marco (0-10)
- Tipo de relleno del marco. - Tipo de relleno del interior. - Color del marco.
- Color del interior.
13
-nus1 Técnico Dise f io .
Arriba se muestra un menú típico que se
que se puede construir con la unidad gráfica.
Esta es uno de l o s objetos mas versatiles de
la unidad ya que se adapta a las necesidades
de programador, los parametros que son modi-
f icables son:
- Número de opciones.
- Dependencias por opcion.
- Procesamiento parametrizado de funciones.
- Tamaño de la ventana de selección.
- Tipo de relleno de la ventana.
- Color de la ventana.
- Color del texto de opcion valida. - Color del texto de opcion invalida.
- Color de los botones de seleccion.
- Color de barra de seleccion.
Diseño.
Una de las ventajas más grandes de un
ambiente gráfico es el uso de iconos, ya se
explico con anterioridad que un icono es una
descripción gráfica de un proceso o procesos
el usuario se posiciona en el icono adecuado
para seleccionar la tarea a realizar.
La inidad gráfica cuenta con una
colección de iconos precontruidos accesibles
al programador como los objetos anteriores,
estos pueden ser parametrizados para su uso,
los iconos que se incluyen son los siguientes.
Manual Técnico Disetío.
Lenguaje de comandos. - La operaciones. que el usuario
tiene a su disposición, se definen en el lenguaje de comandos,
éste espesifica las funciones de manipulación de los objetos
y las operaciones de archivo. Las funciones comunes de
manipulación de objetos, son aquellas que sirven para reoxdenax
y transformar los objetos de una esena. Las operaciones de
archivo pueden ofrecer la creación, cambio de nombre y copiado
de segmentos gráficos. Sobre este lenguaje de comandos se hablará
más extensamente en el manual de usuarios, por ahora sólo
mencionaremos que este se diseño tratando de acercarse mas al
lenguaje común de programaci6n, en este caso el lenguaje C,
cabe mencionar que son accesibles las primitivas GKS que ofrece
el propio compilador de TURBO C.
Una consideración importante en el diseño de una interfaz es
la forma en el que el sistema responderá (dará retroalimentación)
a la entrada del usuario. La retroalimentación, ayuda al usuario
al operar el sistema reconociendo la recepción del comando
enviandole diversos mensajes y señalándole cuándo cuando se han
recibido las selecciones o entrada de datos. Algh tipo de
retroalimentación es parte integral de la estructura del lenguaje
de comandos, en tanto que se ofrecen otras formas de retroalimen-
tación para ayudar a un usuario a entender la operación del
sistema. La unidad gráfica fue diseñada tomando encuenta lo
anterior, en ella se asume una constante comunicación entre el
usuario y el sistema a base de distintos tipos de respuesta,
cómo puede ser la simulación de presionar un botón o el efecto
de cerrar una ventana.
16
wanual TOcnico códigos fuentes.
CAPITULO 3 CODIGOS FUENTE .DE LAS RUTINAS.
I 17
Manual técnico
/*
DEMOSTRACION (FRAME c)
UNIVERSIDAD AUTONOMA METROPOLITANA.
Códigos fuentes
PROGRAMA DE DWSTRACION DEL LA UNIDAD ORAFICA QW COMO PROYECTO DE INVESTIGACION I1 PRESENTAN
/* Función de inicialización de variables para la demostración */ {
int x=35, y=185,i, yi, yf; yi = getmaxy 0 - 25; yf = yi + 17; y = yi + 5 ; setbkcolor (O) ; cleardevice 0 ; if (GraphDriver == 1 I I GraphDriver == 2 I I GraphDriver == 7)
/* TRAZADOS DISPONiBLXS PIUU EL RELLENO */ #define C FONDO O #define CPRIMER PLANO 1 #define LINEA HOE 2 #define DIAGOÑAL 3 #define TICDIAGONAL 4 #define DIAGONALINVRS 5 #define TICDIAGINVRS 6 #define REJA HOR 7 #define REJA-DIAG 8 #define P m - DENSO 9 #define PUNTO-LIGERO 10 #define PUNTO-MEDIO 11
#define TextColor setcolor #define TextBackground setbkcolor #define TextMode setgraphmode #def ine Eo1 ' \O /+ Define el fin de linea + / #define Eof 26 /+ Define el fin de archivo + /
#define ESC Esc #define FN (NI (Se+ (N%101) < < 8 /+ Macro que devuelve el co- + /
#define Shift-FN(N) (83+(N%10))<<8 /+ Macro que devuelve el co- + /
#define Ctrl_F"(N) (93+(N%10))<<8 /+ Macro que devuelve el co- +/
#define Alt-FN(N) (103+(N%10))<<8 /+ Macro que devuelve ei co- +/
#define Ctrl (L) (toupper ( (L) ) -65+1) I Ox0100 /+ Macro que devuelve el co- + /
#define MEZCLA 12
#define PORO-DENSO 12
#define HUELLA-DER 28
#define Esc 27 /+ Define el Escape +/
/+ digo de las teclas de + / /+ funcion F1 a F10 + /
/+ digo de las teclas de fun-+/ /* con Shift de la F1 a F10 +/
/+ digo de las teclas de fun-+/ /+ con Ctrl de la F1 a F10 + /
/+ digo de las teclas de fun-+/ /+ cion con Alt de F1 a F10 +/
/+ digo del la secuncia de +/ /+ control de una letra * /
/* TECLAS ESPECIALES */
#define Ini #define Up #define PgDown #define Lefth #define Rigth #define End #define Down #define PgUp #define Ins #define Del #define Alt Q #define AltW #define AltE #define AltIR #define Alt T -ne AltIY
#define Alt U #define Al t-I #define Alto #define AltP #define AltA #define Alt-C #define AltD #define Al t-F #define AltG #define AltH #define Al t-J #def ine Al t K #define Alt-L #define Alt Z #define Al tIX
#define Alt-C #define Alt-V #define AltB #define AltN #define Al t M #define Alt-1 #define Alt 2 #define Al t-3 #define Alt-4 #define Alt-5 #define Alt6 #define Alt7 #define Alt-8 #define Al t 9 #define Alt-O #define F11- #define F12 #define Shift F11 #define ShiftF12 #define Ctrl Pi1 #define CtrlFl2 #define Alt Fii #define AltF12
#define Lo (C) #define Hi (C) #define Byte #define Word #define Dvord #define relcol (C) #define relrow (C)
(C) hOxOOFF / * ( íC) &OxFFOO) > > E / * unsigned char /* unsigned int / * unsigned long /* ( (colhome+ (C) ) %MaxX) / * ( (rowhome+ ( C ) %MaxY) /*
Parte baja de un word * / Parte alta de un word * / Tipo Byte * / Tipo Word * / Tipo doble word * / Absisa relativa a home * / Ordenada relativa a home * /
struct PTS { Word x , y; I ; / * Estructura que define un punto en pantalla * /
struct SCREEN r FILE 'diskbuff; / * Archivo de memoria virtual de la pantalla char Name [15]; /* Nombre de la pantalla virtual Word tamano; / * Tams-o tipico de la imagen Word numln; / * Numero de lineas grabadas en cada acceso Word xi, / * Absisa inicial de la pantalla virtual
x f I /* Absisa final de l a pantalla virtual yi, / * Ordenada inicial de la pantalla virtual Yf ; / * Ordenada final de la pantalla vixtual
? ;
3
Nanual técnico
b
Códigos fuentes
G r C o n I O D r v . H
typedef struct SCREEN Screen;
struct WindVars I / * La siguiente estructura define una ventana con las * / / * variables de los diferentes estilos de presentacion * /
struct textsettingstype txttype; / * Tipo de texto de la vent * /
struct linesettingstype linetype; /* Tipo de linea de la vent * / . struct fillsettingstype flltype; /* Tipo de relleno * /
/ * Color del fondo * / char bk, fg. fr. frsize, *tit, tcur , t old cur, act ivG, 'charbuff, VideoMode;
Word XMin, XMax, YMin, YMax , xcur , YCUI ;
Screen 'videobuff;
/* Color del primer plano * / /* Color del marco y titulo * /
/ * Tipo de cursor de la vent*/ /* Tama.0 del marco * /
/* Titulo de la ventana * /
/ * Tipo de cursor anterior * / / * i si la ventana es activa*/ / * Apuntador al texto * /
/* Modo de video de la vent * / / * coordenada X inicial * / /* Coordenada X final * / / * Coordenada Y inicial * / /* Coordenada Y final * / / * X anterior del cursor * / /* Y anterior del CUISOI * /
/ * Apuntador pantalla de * / / * de respaldo de video * /
I ;
struct StackNodo { / * Estrucura que define * / struct WindVars *WD; /* un nodo de la pila de * / struct StackNodo 'WDDown; / * ventanas que controlan * / struct StackNodo *WDUp; / * su desplegado * / void *vd; I ;
struct PILA w { strÜct StackNodo 'Tope; /* PILA DE VENTANAS * /
I ;
struct PILA-W STACK;
int - Cdecl Makewindow (char *tit,struct WindVars *Mind, Screen -Cdecl backingvideo (int x i , int yi, int xf, int yf);
Cdecl restorevideo (Screen *SCl ; int Cdecl Savewindow (struct WindVars "wind); int Cdecl RestoreWindow (struct WindVars *Wind); int
. int - Cdecl scrollup (int xi, int yi, int xf, int yf, int n,int); int - Cdecl scrolldown (int xi, int yi,int xf, int yf,int n,int); int int int Cdecl gprintf (int,int,char *fmt, . . . ) ; void int - Cdecl readkeyword (void) ; void - Cdecl window (int xi, int yi, int xf, int yf); int - Cdecl framewindow (int xi, int yi, int xf,int yf, int CML,int PML,
int PATT, int COLOR, int SFR); int int int
int Cdecl pushwindow (struct WindVars *WD) ; struct StackNodo *
char 1 Cdecl GetChar (void) ; void - Cdecl GoToXY (int x , int y); void - Cdecl Setbkcolor (int c); void Cdecl Setcolor (int c); int -Cdecl - Getcolor (void) ; int - Cdecl Getbkcolor (void) ; int Cdecl setfillMode (int, int) ; tendif /*-UAM-GRDE * /
int Xi, int Yi, int Xf, int Yf, int bk, int fg, int fr);
Esta r u t i n a asigna el e s p a c i o en memoria n e c e s a r i o para d e f i n i r una ventana g r á f i c a , a s i mismo i n i c i a l i z a l o s v a l o r e s n e c e s a r i o s para su uso por l a s demas r u t i n a s
*/ char +tit; struct WindVaxs +Wind; int Xi,Yi,Xf,Yf; char bk,fg,fr; I
if (!err) getfillsettings (&(Wind->flltype)); erx = graphIesult O;
err = graphresult O; return (err) ;
2
Manual técnico
/I
Códigos fuentes
1
/'
+/ I
I
Rutina interna a la unidad gráfica, su función consiste en construir un nombre único para un archivo de mapa de bit's que se utilizará como memoria virtual para respaldar el video del la pantalla.
char 'nombre;
- Num win-[3] = O; nombIe = (char '1 malloc (15); memset (nombre,NüLL,i5) ; strcat (nombre,"C:UAMI") ; strcat (nombre, Num win 1; if (-Num-win-í2~ ==-I9
Num win [21 = 'O'; {
Tf (rNumrwin-[ll == '9')
eise ~~
Num win [2]= Num_win-[21 + 1; reTurñ (nóÍmbre);
Screen 'backingvideo íxi,yi,xf,yf) /*
E s t a rutina tiene como función el respaldar el video en la memoria secundaria, se utilizo la memoria secundaria como memoria virtual por ser ésta mas grande que la prin- cipal.
+/ int xi,yi,xf,yf; I
Scxeen 'SC; void far *tmp; FILE 'fopen 0 ; Woxd tamano, y, sizeln, lasty, numlns, incdif, holatmp; char 'Name; int err ;
Esta funcibn tiene como objetivo cargar de un archivo preparado anteriomente con backingvideo, y desplegar su contenido en pantalla, cabe mencionar que el archivo debe estar en un formato de mapa de bit's, y que el modo de video debe ser compatible.
'/ Screen +SC; I
void far *tmp; Word tamano, y;
SC->diskbuff = fopen (SC->Name,"rb") ; trnp - malloc ((Word) 32384); if ( ! tmp) return (-6) ; y = SC->yi; do
Esta función realiza un desplegado hacia arriba del contenido que se encuentra entre las cordenadas especificadas en un nu- mero n de renglones (pixeles) y llena el espacio del color dado
Esta función realiza un desplegado hacia abajo del contenido que se encuentra entre las coordenadas especificadas en un nu- mero n de renglones (pixeles) y llena el espacio del color dado
Esta rutina es la primera que se tiene que usar y es obligatoria, en ella se inicializan las variables y procesos necesarios para el funcionamiento del la unidad gráfica
/*
*/ ( int xasp, yasp, err; /* Used to read the aspect ratio*/
STACK.Tope = NULL; GrapMx iver = DETECT; /+ Request auto-detection */ initgraphí &GrapMriveI, hGraphMode, " I ' 1 ; exr = graphrecult 0 ; /* Read result of ini tiaiiza tion*/ if ( err ! = grOk í /* Error occured during init */
1 getpalette ( &palette ) ; /* Read the palette from board */ MaxCoiors = getmaxcolox0 + 1; /* Read maximum number of colors*/ maxcollength = MaxX = getmaxx0; maxrowlength = MaxY = getmaxy 0 ; /* Read size of screen */ colhome = cuxrentrow = O ; rowhome = currentcol = O ; getaspectratio( &xasp, hyasp 1 ; /* read the hardware aspect */ AspectRatio = (doub1e)xasp / (doub1e)yasp; /+ G e t correction factor */
:;etfillMode (Nwind->flltype.pattern,NWind->flltype.colo~) ; ':eturn ( O ) ;
6
f
int pushwindow (WD) /* Esta función mete una ventana en la pila, respaldando el video
que esta abajo de ella, el tipo de pila no es presisamente una pila ya que esta ofrece la posibilidad de sacar nodos que no nr- cesariamente estan en el tope.
E s t a r u t i n a lee el e s t a d o d e l t e c l a d o , hac iendo una pausa /*
h a s t a que se haya p u l s a d o una tecla, r e g r e s a el cod igo ya d e f i n i d o en e l encabezado con a t e r i o r i d a d para l a s t e c l a s e s p e c i a l e s o el c o d i g o a s c i i para l a s normales .
*/ char c a r , ex t : int caractdr; union REGS inregs, outregs;
inregs.x.ax = O; intü6 (Oxl6,&inregs,&out1egs) ; car = outregs.h.al; ext = outregs.h.ah; caracter = car + (ext<<üI; return (caractex) ;
8
Manual técnico
I
GrWindowe . l i b Códigos fuentes
char GetChar (void)
Esta función lee un caracter desde teclado o el estado del ratón, devolviendo ya sea la tecla presionada o las coordenadas y el botón que se presiono.
/*
*/ I
int x, y, 1. backcolor, frcolor, TxtSzeH, TxtSzeV; int yi,yf ;
/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/ /+ +/ /+ RUTINAS DE A!FRIBUTOS DE DESPLEGADO +/ /+ +/ / t + t t + t C C t t + t t C t + + t t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + t t + + + + + + + ~ + + + + C + /
int setfillMode (int, int);
int setfillMode (patt, color)
/* Esta funcion establese el tipo de relleno a utilizar,
a los tipos utilizados en Turbo graphics se aunan otros definidos en la iniciación de variables de la unidad.
*/
int patt, color; 1
int ers=ü;
10
Manua 1 técnico G r W i n d o w s . l i b
if (patt > 11) if (pat t <3 1) setfillpattern (&patterns [patt-121 [ O 1 , color) ; el se err = - 1 4 ;
else setfillstyle (patt.co101);
return (err) ; 1
int framewindow (xi, yi, xf, yf, CML, PML, P A T T , COLOR, SFR)
Dibuja el marco de una ventana con los atributos dados, como son color del marco, tipo de relleno del marco, color del interior de la ventana y tipo de relleno del interior de la ventana.
/*
+/
int xi, yi, xf, yf, CML, PML, F A R , COLOR, SFR; I
int fgcolor, XI, yx, WidthFr, CMLB; struct fillsettingstype fillback;
if (GxaphDriver==l 1 1 GxaphDriver==2 I 1 GxaphDriver==7) i CML 5 o ; P A T T - 29; PML = 29; COLOR = 1:
setcolor (7) ; line (xi+xr,yi+yr,xi+xr,yf-yI); line (xi+xr,yi+yr.xf-xr.yi+yr): line (xi+xr+~,yf -yr-3,xf -xr-S,yf-yr-3) ; 1 ine (xf -xx -6, yf -yr - 3, xf -XI -6 ,Y i+yr+3) ;
setcolor (O) ; line (xi+xr+6,yi+yr+4,xi+x1+6,yf -yr-4) ; line (xf -xr+i,yi+yx,xf -xi+i,yf -p); line (xi+xr+S,yi+yr+3,xf -xr-6,yi+yr+31 ;
I ( x i + x r + ~ , y i + y 1 + 3 , x f - ~ ~ - ~ , ~ f - ~ 1 - 3 ) ; /* Chaflan int */
I else
( if (GraphDriver==l 1 1 GraphDrive1==2 I I GrapMriver==7) [ /* Solo cuando tenemos Monocromatico */ setcolor ( O ) ; ClearRec (xi+2,yi,xf,yf,l,l.29,0,0,0); line (xi+3,yf -i,xf ,yf -1) ; line (xi+i,yf ,xf ,yf 1 ; line (xf ,y1 ,xf, yf); line (xf -1,yi.xf -i,yf) ; line (xf -3,yi+i,xf -3,yf) ;
floodfill (xloc+l,yloc+textheight ("H") 11.0) ; I ;
setcolox (c) ; vaend( argptr 1 ; return( cnt 1;
/* Close va functions */ /* Return fie conversion count */
int gprintf(int color, int bkcolor, char 'fmt, ... 1
/* Escribe una cadena formateada en pantalla en la posición
actual del cursor con los colores de fondo y primer plano especificados, para moyor información consul te el manual de referencia.
*/
I int x=O,y=O,i=O, oldcolor; va list argptr; /* Argument list pointer */ char str [2001, car [21 ; /* Buffer to build sting into */ int cnt; /* Result of SPRIhl'F for return */ x = relcol (currentcol) ; y = relrow (currentrow) ; oldcolor = getcolor 0 ;
cnt = vsprintf ( str, fmt, argptr ) ; /* prints string to buffer */ vhile (str [ill {
va-start( argptz, format 1; /* initialize va- functions */
if ( (x+textwidth ("H") ) > (colhome+maxcollength) 1 sal toln: currentcol=O; currentrow = curIentIow+ (int) (textheight ("H") '1.29) ; x = relcol ícurrentcol); y = relrow (currentrow); if í (y+ (int) (textheight ("H") 1.1.25) > (rowhome + mexrowlength) ) i currentrow = currentrow - (int) (textheight ("H")*1.25) ; y = relrow (currentrow); scrollup (colhome,rowhome,colhome+maxcollength,
el se r I x = relcol (currentcol): y = relrow (currentrow); car103 = strIi1; ~ariil = ' \ O ' ; 1++; if (carIO] == *\no) goto saltoln; CleaIRec (~,y,x+textwidth(car),y+textheight(car)+l,
if (GraphDriver == 1 1 1 GraphDriver == 5 I ( GraphDriver == 7 )
el se
outtextxy( x, y, car); /* Send string in graphics mode */
static double AspectRatio; /* Aspect r a t i o o f a pixel on the screen */ static int GraphDriver; static int GraphMode,
*/ MaxX, MaxY,
*/ MaxColors,
*/ currentcol,
ventana */ cur1 entrow, /* Renglon actual r e l a t i v o a l a ventana
*/ maxco 1 length, /* Maxima longitud de renglon de
maxr owleng th, /* Maxim0 longitud ver t i c a l de
colhome , /* Columna absoluta de i n i c i o de l a
r owhome /* Renglon absoluto de i n i c i o de l a
- bkcol or I S tyl-image,
ticursor=200; /* Retardo de l parpadeo para el CUISOI
/* Modo graf ico por d e f a u l t
/* Maxima resolucion de p a n t a l l a
/* Maxim0 numero de co lores d i spon ib l e s
/* Columna ac tua l r e l a t i v a a l a
desplegado */
despi egado */
ventana ac tua l */
ventana ac tua l */
*/ */
/ * E s t i l o de imagen por d e f a u l t
1
Manual t é c n i c o
~
INITVARS . II Cbdigos fuentes
static struct fillsettingctype Styl-fill;/* E s t i l o de re l leno por de fau l t */ static struct linesettingstype Styl-line;/* E s t i l o de l i nea por defau l t */ static struct textsettingstype Styl-text;/* E s t i l o de texto por defau l t */ static struct palettetype palette; de fau l t */ static struct PILA-W STACK; */
/* Paleta def inida por
/* Pila de ventanas
/* El siguiente arreglo define la imagen que se utilizará para la imagen del cursor */