API de
sistema gráfico elemental
Un programa mínimo con este sistema gráfico elemental, basado en X11,
consiste en crear el cuerpo de las siguientes funciones:
#include "../Grafico.h"
void rePinta(){agregar sentencias en este lugar}
void mousePress(int x, int y, int b){agregar sentencias en este lugar}
void mouseRelease(int x, int y, int boton){agregar sentencias en este lugar}
void mouseMove(int x,int y){agregar sentencias en este lugar}
void mouseDrag(int x,int y, int b){agregar sentencias en este lugar}
main(){
ventanaB(700,500); // abre una ventana y main queda bloqueada
//ventana(700,500); esta si no se quiere el bloqueo de main
}
Este programa mínimo asume que el
archivo Grafico.h se encuentra
en el directorio padre.
a) En la función función main se debe llamar una sóla de las funciones
siguientes:
ventana(int dx, int dy)
Esta función crea una ventana de ancho dx y alto dy, es una función no-bloqueante, es
decir, se crea la ventana pero sigue la ejecución en la sentencia
siguiente. Si la función main termina la ventana se cierra. Esta función
se debe usar si se quiere tener una hebra de ejecución mientras la
ventana está activa, esto es, combinar la programación orientada al
evento con la procedural.
ventanaB(int, int)
Esta función crea una ventana de ancho dx y alto dy, es una función bloqueante, es
decir, se crea la ventana pero no sigue la ejecución en la sentecia
siguiente. Es útil si sólo se va a crear un programa orientado al
evento.
b) Las funciones:
void mousePress(int x, int y, int boton)
void mouseRelease(int x, int y, int boton)
void mouseMove(int x,int y)
void mouseDrag(int x,int y, int boton)
son llamadas cunado ocurren los eventos
de mouse de oprimir un botón, mover el mouse y mover el mouse con un
botón oprimido dentro de la ventana. Los argumentos x e y
tienen las coordenadas del cursor al ocurrir el evento. El argumento boton indica qué botón del mouse
produjo el evento con los valores 1,2 y 3. Se les debe incorporar las
sentencias que manejen la situación para ele evento correspondiente.
Si no se incluyen sus declaraciones (aunque el cuerpo no haga nada), no
se genera el programa ejecutable. Estas funciones no deben ser llamadas
por otra función.
c) La función:
void rePinta()
es llamada cada vez que la ventana
abierta por la función ventana()
o ventanaB(), tienen un cambio:
abrirse, cambiar de tamaño, cambiar de profundidad, etc. Si se desea
llamar desde otra de las funciones del programa, se debe llamar
indirectamente por medio la función update().
Sin se llama directamente, el programa puede fallar.
d) Los colores definidos son los siguientes:
#define negro "#000000"
#define blanco "#ffffff"
#define rojo "#ff0000"
#define verde "#00ff00"
#define azul "#0000ff"
#define amarillo "#ffff00"
#define magenta "#ff00ff"
#define cyan "#00ffff"
#define nuevocolor "#905523"
Se pueden agregar más colores creando
nuevos string estáticos o bién en forma dinámica.
e) Las siguientes funciones pueden ser llamadas desde el nuevo programa:
void ventana(int, int);
void ventanaB(int, int);
void setForegroundColor(const char *); // cambia el color del pincel
void setForegroundColorRGB(unsigned char R,unsigned char G,unsigned char B); // cambia el color del pincel
void setGrosorLinea(unsigned int); // cambia el grosor de la linea que se dibuja
int ancho(void); // devuelve el ancho de la ventana
int alto(void); // devuelve el alto de la ventana
f) Las siguientes funciones dibujan directamente en la ventana y
aparecen de inmediato en ella. No se recomienda su uso si se está
usando el doble bufer.
void fillArc(int x,int y,int dx,int dy,int angulo1,int angulo2);
void drawArc(int x,int y,int dx,int dy,int angulo1,int angulo2);
void fillRect(int x, int y, int dx, int dy);
void drawRect(int, int, int, int);
void drawString(char *,int, int);
void drawLine(int, int, int, int);
void fillPolygon(Xpoint p[], int npoints); //p es una estructura de "npoints" pares: p[i].x y p[i].y
void drawPolyline(Xpoint p[], int npoints);
g) Las siguientes funciones dibujan en un bufer que es memoria distinta
de la ventana, es decir, no aparecen de inmediato en ella.
Luego de dibujar todas las figuras en el bufer, se puede llamar a
la función buferDisplay(), que
copia desde el bufer a la ventana.
void fillArcd(int x,int y,int dx,int dy,int angulo1,int angulo2);
void drawArcd(int x,int y,int dx,int dy,int angulo1,int angulo2);
void fillRectd(int x, int y, int dx, int dy);
void drawRectd(int, int, int, int);
void drawStringd(char *,int, int);
void drawLined(int, int, int, int);
void fillPolygond(Xpoint p, int npoints);
void drawPolylined(Xpoint p, int npoints);
h) La función:
void update(void);
es para llamar a la función buferDisplay() desde el programa
creado.
i) la función:
void buferDisplay(void);
copia el contenido del bufer en el
diplay de la ventana. Se debe llamar una vez al final de de las llamadas
a las funciones de dibujo.
ii) la función:
void setCursor(unsigned int micursor);
cambia el cursor . Ver lista
de cursores
Ejemplo: setCursor(XC_watch);
iii) la función:
void keyPress(unsigned int key);
entrega el código de la tecla oprimida
cuando la ventana está activa. Para detalle de los códigos ver el
archivo:
/usr/include/X11/keysymdef.h