32 Rutinas GUI

Allegro posee un gestor de di�logos orientados a objetos que originalmente se basa en el sistema GEM del Atari (form_do(), objc_draw(), etc: programadores veteranos del ST saben de lo que estoy hablando :-) Puede usar el GUI tal y como esta para crear interfaces simples para cosas como el programa test y la utilidad grabber, o puede usarlo como base para sistemas m�s complicados que cree. Allegro le deja definir sus propios tipos de objetos y escribir nuevos procesos de di�logo, por lo que tendr� control total sobre los aspectos visuales de la interfaz mientras todav�a usa Allegro para controlar el rat�n, teclado, joystick, etc.

Un di�logo GUI se almacena como un array de objetos DIALOG, de los cuales cada uno cuenta con los siguientes par�metros:

   typedef struct DIALOG
   {
      int (*proc)(int, DIALOG *, int); - proceso del di�logo (controlador de
                                         mensajes)
      int x, y, w, h;                  - posici�n y tama�o del objeto
      int fg, bg;                      - colores de letra y fondo
      int key;                         - atajo ASCII del teclado
      int flags;                       - variable con el estado del objeto
      int d1, d2;                      - �selos para lo que quiera
      void *dp, *dp2, *dp3;            - punteros a datos espec�ficos del objeto
   } DIALOG;
El array debe acabar con un objeto que tiene el proceso de di�logo puesto a NULL.

El campo de bits puede contener cualquier combinaci�n de los siguientes bits:

   D_EXIT          - este objeto debe cerrar el di�logo al activarse
   D_SELECTED      - este objeto est� seleccionado
   D_GOTFOCUS      - este objeto tiene el foco de entrada
   D_GOTMOUSE      - el rat�n esta actualmente encima del objeto
   D_HIDDEN        - este objeto est� oculto e inactivo
   D_DISABLED      - este objeto est� de color gris e inactivo
   D_DIRTY         - este objeto necesita ser redibujado
   D_INTERNAL      - �no use esto! Es para uso interno de la biblioteca...
   D_USER          - cualquier valor m�ltiplo de dos mayor que �ste esta
                     libre para que lo use
Cada objeto es controlado por un proceso de di�logo, que se almacena en el puntero proc. Este ser� llamado por el gestor de di�logos cuando se produzca alguna acci�n que involucre al objeto, o puede llamarlo directamente con la funci�n object_message(). El proceso de di�logo debe seguir la siguiente forma:
   int foo(int msg, DIALOG *d, int c);
Se le pasar� una variable (msg) indicando qu� debe hacer, un puntero al objeto concerniente (d), y si msg es MSG_CHAR o MSG_XCHAR, la tecla que ha sido pulsada (c). F�jese que d es un puntero a un objeto especifico y no al di�logo entero.

El proceso del di�logo deber�a devolver uno de los siguientes valores:

   D_O_K          - estado normal de retorno
   D_CLOSE        - le dice al gestor de di�logos que cierre el di�logo
   D_REDRAW       - le dice al gestor de di�logos que redibuje el di�logo
   D_REDRAWME     - dice al gestor de di�logos que redibuje el objeto actual
   D_WANTFOCUS    - requiere que se le de el foco de entrada al objeto
   D_USED_CHAR    - MSG_CHAR y MSG_XCHAR devuelven esto si se uso una tecla
Los procesos de di�logo se pueden llamar con cualquiera de estos mensajes:

MSG_START:
Le dice al objeto que se inicialice. El gestor de di�logo manda esto a todos los objetos del di�logo justo antes de mostrarlo.

MSG_END:
Se manda a todos los objetos cuando se cierra un di�logo, permiti�ndoles que hagan los procesos de limpieza que necesiten.

MSG_DRAW:
Le dice al objeto que se dibuje en pantalla. El puntero del rat�n se desactivara cuando este mensaje sea mandado, para que el c�digo de dibujado no se preocupe por �l.

MSG_CLICK:
Informa al objeto que un bot�n del rat�n a sido pulsado mientras el rat�n estaba encima del objeto. Normalmente el objeto realizar� su propio seguimiento del rat�n mientras el bot�n est� pulsado, y s�lo volver� de este controlador de mensaje cuando se suelte el bot�n.

MSG_DCLICK:
Se manda cuando el usuario hace un doble click en un objeto. Primero se manda el mensaje MSG_CLICK cuando se presiona el bot�n por primera vez, y entonces MSG_DCLICK si se suelta y vuelve a presionar otra vez en un corto periodo de tiempo.

MSG_KEY:
Mandado cuando el atajo de teclado del objeto se presiona, o si se pulsa enter, espacio, o alg�n bot�n del joystick cuando el objeto tiene el foco de entrada.

MSG_CHAR:
Cuando se pulsa una tecla, este mensaje es mandado al objeto que tiene el foco de entrada, con un formato de c�digo de car�cter igual al de la funci�n readkey() (valor ASCII en el byte bajo, scancode en el byte alto) como par�metro c. Si el objeto trata con la pulsaci�n de teclas deber�a devolver D_USED_CHAR, en caso contrario deber�a devolver D_O_K para permitir operar al interfaz de teclado por defecto. Si necesita acceder a la entrada de un car�cer Unicode, deber�a usar MSG_UCHAR en vez de MSG_CHAR.

MSG_UCHAR:
Si un objeto ignora la entrada MSG_CHAR, este mensaje ser� mandado inmediatemente despu�s de �l, pasando el valor completo de la tecla en Unicode como par�metro c. Esto le permite leer c�digos de car�cteres mayores que 255, pero no puede decirle nada sobre el scancode: si necesita saberlo, use MSG_CHAR en lugar de MSG_UCHAR. Este manejador debe devolver D_USED_CHAR si proces� la entrada, o D_O_K en otro caso.

MSG_XCHAR:
Cuando se pulsa una tecla, Allegro mandar� MSG_CHAR y MSG_UCHAR al objeto que tenga el foco de entrada. Si este objeto no procesa la tecla (ej. devuelve D_O_K en vez de D_USED_CHAR), el gestor de di�logos buscar� un objeto con un atajo de teclado asociado en el campo key, mand�ndole un MSG_KEY. Si esto falla, mandar� un MSG_XCHAR al resto de los objetos del di�logo, permiti�ndoles responder a pulsaciones de tecla especiales incluso cuando no tienen el foco de entrada. Normalmente deber�a ignorar este mensaje (devolver D_O_K en vez de D_USED_CHAR), en cuyo caso Allegro realizar� las acciones por defecto tales como mover el foco de entrada en respuesta a los cursores y cerrar el di�logo si se pulsa ESC.

MSG_WANTFOCUS:
Determina si un objeto quiere recibir el foco de entrada. Deber� devolver D_WANTFOCUS si lo desea, o D_O_K si no esta interesado en recibir datos del usuario.

MSG_GOTFOCUS:
MSG_LOSTFOCUS:
Es mandado cuando un objeto gana o pierde el foco de entrada. Estos mensajes siempre son seguidos por un MSG_DRAW, para dejar que los objetos se redibujen de manera diferente. Si devuelve D_WANTFOCUS en respuesta a un evento MSG_LOSTFOCUS, esto le permitir� a su objeto quedarse con el foco de entrada incluso si el rat�n deja de estar sobre �l y se pone sobre el fondo u otro objeto inerte, por lo que solamente perder� el foco de entrada cuando otro objeto est� preparado para cogerlo (este truco es usado por el objeto d_edit_proc()).

MSG_GOTMOUSE:
MSG_LOSTMOUSE:
Es mandado cuando el rat�n se pone o quita de un objeto. A diferencia de los mensajes de foco, a estos no les sigue un MSG_DRAW, por lo que si el objeto se dibuja de forma diferente cuando el rat�n esta encima suyo, es responsable de redibujarse �l solo como respuesta a estos mensajes.

MSG_IDLE:
Es mandado cuando el di�logo de gestor no tiene nada mejor que hacer.

MSG_RADIO:
Es mandado por botones de radio para deseleccionar otros botones en el mismo grupo cuando son pulsados. El n�mero del grupo se pasa en el par�metro del mensaje c.

MSG_WHEEL:
Enviado al objeto que tenga el foco de entrada cada vez que se mueve la rueda del rat�n. El par�metro c de mensaje contiene el n�mero de clicks.

MSG_LPRESS, MSG_MPRESS, MSG_RPRESS:
Enviado cuando el bot�n correspondiente del rat�n es presionado.

MSG_LRELEASE, MSG_MRELEASE, MSG_RRELEASE:
Enviado cuando el bot�n correspondiente del rat�n es soltado.

MSG_USER:
El primer valor de mensaje libre. Cualquier n�mero a partir de aqu� (MSG_USER, MSG_USER+1, MSG_USER+2, ... MSG_USER+n) es libre para lo que quiera.

Allegro trae varios procesos de di�logo est�ndar. Puede usarlos tal como vienen para crear una interfaz de objetos simples, o puede usarlos desde sus propios proceses de di�logo, resultando en una especie de herencia de objetos. Por ejemplo, podr�a hacer un objeto que llama d_button_proc para dibujarse, pero controla el mensaje de pulsaci�n del bot�n del rat�n de forma diferente, o un objeto que llama d_button_proc para cualquier cosa excepto para dibujarse a si mismo, por lo que se comportar�a como un bot�n normal pero podr�a ser completamente diferente.

Desde la versi�n 3.9.33 (CVS) de Allegro, algunos objetos y men�s de la interfaz gr�fica de usuario son dibujados de forma diferente en comparaci�n con versiones anteriores de Allegro. Los cambios son:



int d_clear_proc(int msg, DIALOG *d, int c);
Esto simplemente borra la pantalla al ser dibujado. Util como el primer objeto de un di�logo.


int d_box_proc(int msg, DIALOG *d, int c);
int d_shadow_box_proc(int msg, DIALOG *d, int c);
Estos dibujan cajas en la pantalla, con o sin sombra.


int d_bitmap_proc(int msg, DIALOG *d, int c);
Esto dibuja un bitmap en la pantalla, que deber� ser apuntado por el campo dp.


int d_text_proc(int msg, DIALOG *d, int c);
int d_ctext_proc(int msg, DIALOG *d, int c);
int d_rtext_proc(int msg, DIALOG *d, int c);
Estos dibujan texto en la pantalla. El campo dp debe apuntar a la cadena de texto a visualizar. d_ctext_proc() centra la cadena alrededor de la coordenada x, y d_rtext_proc la alinea a la derecha. Todos los car�cteres '&' de la cadena ser�n reemplazados por l�neas debajo del siguiente car�cter, para ense�ar los atajos de teclado (tal y como en MS Windows). Para ense�ar el caracter normal, ponga "&&". Para dibujar el texto con otra cosa que no sea la fuente por defecto, ajuste el campo dp2 para que apunte a una fuente propia.


int d_button_proc(int msg, DIALOG *d, int c);
Un bot�n objeto (el campo dp apunta a una cadena de texto). Este objeto puede ser seleccionado pinchando sobre �l con el rat�n o presionando su atajo de teclado. Si se pone el bit D_EXIT, el seleccionarlo provocar� el cierre del di�logo. Si no, encender� y apagar� el di�logo. Como en d_text_proc(), puede usar el caracter '&' para ense�ar el atajo de teclado del bot�n.


int d_check_proc(int msg, DIALOG *d, int c);
Este es un ejemplo de c�mo puede derivar objetos desde otros objetos. La mayor�a de la funcionalidad viene de d_button_proc(), pero se visualiza como un recuadro a marcar. Si el campo d1 no es cero, el texto se imprimir� a la derecha de la marca, en caso contrario estar� a la izquierda.

Nota: el ancho del objeto debe reservar espacio tanto para el texto como para el recuadro (que es cuadrado, con lados del mismo tama�o que la altura del objeto).


int d_radio_proc(int msg, DIALOG *d, int c);
Un objeto de bot�n de radio. Un di�logo puede contener cualquier n�mero de grupos de botones de radio: el seleccionar un bot�n de radio provoca que los otros botones del mismo grupo se desactiven. El campo dp apunta a una cadena de texto, d1 requiere el n�mero de grupo especifico, y d2 es el estilo del bot�n (0=c�rculo, 1=cuadrado).


int d_icon_proc(int msg, DIALOG *d, int c);
Un bot�n bitmap. El color fg es usado por la l�nea de puntos que ense�a el foco, y el color bg hace la sombra que rellena la parte superior e izquierda del bot�n cuando este se presiona. d1 es la "profundidad", es decir, el n�mero de pixels que el icono ser� movido abajo a la derecha cuando se seleccione (por defecto 2) si no hay imagen "seleccionada". d2 es la distancia entre los puntos de la l�nea del foco. dp apunta a un bitmap para el icono, mientras que dp2 y dp3 son las im�genes de bot�n seleccionado y no seleccionado (esto es opcional, puede ser NULL).


int d_keyboard_proc(int msg, DIALOG *d, int c);
Este es un objeto invisible para implementar atajos de teclado. Puede poner un c�digo ASCII en el campo de la tecla del di�logo del objeto (un caracter como 'a' responde a la pulsaci�n de tecla, un n�mero del 1 al 26 responde a Ctrl+una tecla a-z), o puede poner un scancode del teclado en el campo d1 y/o d2. Cuando una de estas teclas es presionada, el objeto llamar� a la funci�n apuntada por dp. Esto deber�a devolver un entero, el cual se pasar� de vuelta al gestor de di�logo, para que pueda devolver D_O_K, D_REDRAW, D_CLOSE, etc.


int d_edit_proc(int msg, DIALOG *d, int c);
Un objeto de texto editable (el campo dp apunta a la cadena de texto). Cuando tiene el foco de entrada (obtenido al pinchar sobre el objeto con el rat�n), se puede teclear texto en el objeto. El campo d1 indica el n�mero m�ximo de car�cteres que se aceptaran, y d2 es la posici�n del cursor dentro de la cadena de texto.


int d_list_proc(int msg, DIALOG *d, int c);
Un objeto caja de lista. Esto permite al usuario ir hacia arriba o abajo de la lista de �tems y seleccionar uno pinchando con el rat�n o usando las teclas. Si el bit D_EXIT est� activado, haciendo doble click en la lista de �tems cerrar� el di�logo. El �ndice del objeto seleccionado se encuentra en el campo d1, y d2 es usado para indicar hasta d�nde se ha desplazado la lista de �tems. El campo dp apunta a una funci�n que ser� llamada para obtener informaci�n sobre los contenidos de la lista. Esto deber�a seguir el modelo:

      char *foobar(int index, int *list_size);
Si index es cero o positivo, la funci�n debe devolver un puntero a la cadena que debe ense�arse en la posici�n index en la lista. Si index es negativo, debe devolver NULL y en list_size debe poner el n�mero de �tems de la lista.

Para crear una lista de selecci�n m�ltiple, haga apuntar dp2 a un array de variables de un byte que indican el estado de selecci�n de cada �tem de la lista (distinto de cero para entradas seleccionadas). �Esta tabla debe ser al menos tan grande como el n�mero de objetos de la lista!


int d_text_list_proc(int msg, DIALOG *d, int c);
Igual que d_list_proc, pero permite que el usuario escriba algunos de los primeros car�cteres de una entrada de la caja de listas para as� seleccionarlo. Se usa dp3 internamente, as� que no deber� poner nada importante ah� por s� mismo.


int d_textbox_proc(int msg, DIALOG *d, int c);
Un objeto caja de texto. El campo dp apunta al texto que debe ense�arse en la caja. Si el texto es largo, habr� una barra de desplazamiento vertical a la derecha del objeto que podr� ser usada para mover el texto dentro de la caja. El valor por defecto es imprimir el texto con ajuste de anchura a nivel de palabra, pero si se activa el bit D_SELECTED, el texto se imprimir� con ajuste de anchura a nivel de car�cter. El campo d1 se usa internamente para guardar el n�mero de l�neas de texto, y d2 es usado para guardar hasta d�nde se ha desplazado el texto.


int d_slider_proc(int msg, DIALOG *d, int c);
Una barra de desplazamiento. Este objeto tiene un valor en d2, con rango de 0 a d1. Ense�ar� una barra de desplazamiento vertical si h es m�s grande o igual a w, de otro modo ense�ar� una barra horizontal. El campo dp puede contener un bitmap opcional que usar� la barra de desplazamiento, y dp2 puede contener una funci�n opcional de callback, que ser� llamada cada vez que d2 cambie. La funci�n callback deber�a seguir el prototipo:

      int function(void *dp3, int d2);
El objeto d_slider_proc devolver� el valor de la funci�n callback.


int d_menu_proc(int msg, DIALOG *d, int c);
Este objeto es una barra de men� que abre men�s hijos cuando se pincha en �l o cuando alguna combinaci�n alt+tecla es pulsada y se corresponde con alg�n atajo del men�. El objeto ignora muchos de los campos de la estructura de di�logo, particularmente el color se coge de las variables gui_*_color, y el ancho y alto se calculan autom�ticamente (los cambos w y h de la estructura DIALOG s�lo se usan como tama�o m�nimo). El campo dp apunta a un array de estructuras de men�: mire do_menu() para m�s informaci�n. El nivel de arriba del men� ser� visualizado como una barra horizontal, pero cuando aparezcan los men�s hijos, aparecer�n con el formato vertical usual usado por do_menu(). Cuando un �tem del men� es seleccionado, el valor de retorno de la funci�n del men� se pasa al gestor de di�logo, para que las funciones de sus men�s puedan devolver D_O_K, D_REDRAW, o D_CLOSE.

Relacionado con: Menus gui, active_menu, gui_menu_draw_menu.
int d_yield_proc(int msg, DIALOG *d, int c);
Un objeto ayudante invisible que rechaza rebanadas de tiempo de la CPU (si el sistema lo soporta) cuando la interfaz no tiene nada m�s que hacer que esperar las acciones del usuario. Deber�a poner al menos un objeto de este tipo en cada array ya que podr�a ser necesario en sistemas con un algoritmo de planificaci�n de tareas inusual (por ejemplo QNX) para hacer la interfaz totalmente responsiva al usuario.

El comportamiento del gestor de di�logos se controla con las siguientes variables:


extern int gui_mouse_focus;
Si esta activado, el foco de entrada sigue al puntero del rat�n, de otro modo, un click es requerido para mover el foco de entrada.


extern int gui_fg_color, gui_bg_color;
Los colores de primer plano y fondo de los di�logos est�ndar (alertas, men�s, y el selector de ficheros). Por defecto son 255 y 0.

Relacionado con: gui_mg_color, set_dialog_color.
extern int gui_mg_color;
El color usado para ense�ar los di�logos en gris (los que tienen el bit D_DISABLED activado). Por defecto es 8.
Relacionado con: gui_fg_color, set_dialog_color.
extern int gui_font_baseline;
Si se pone a un valor distinto de cero, ajusta los subrayados mostrados por los atajos de teclado para que igualen el tama�o de las letras de la fuente que sobresalgan por debajo.


extern int (*gui_mouse_x)();
extern int (*gui_mouse_y)();
extern int (*gui_mouse_z)();
extern int (*gui_mouse_b)();
Funciones de enganche, usadas por las rutinas GUI siempre que necesiten acceder al estado del rat�n. Por defecto �stas devuelven copias de las variables mouse_x, mouse_y, mouse_z y mouse_b, pero pueden ser usadas para situar o escalar la posici�n del rat�n, o para leer datos de una fuente totalmente diferente.


gui font

Puede cambiar el puntero global a 'font' para hacer que los objetos del GUI usen otra cosa que la fuente est�ndar 8x8. Los procesos est�ndar de di�logo, los men�s, las cajas de alerta, trabajar�n con fuentes de cualquier tama�o, pero el di�logo gfx_mode_select() aparecer�n mal con cualquier cosa que no sean fuentes de 8x8.


int gui_textout(BITMAP *bmp, const char *s, int x, y, color, centre);
Funci�n de ayuda usada por las rutinas GUI. Dibuja una cadena de texto en la pantalla, interpretando el caracter '&' como el subrayado para ense�ar los atajos de teclado. Devuelve el ancho de la cadena en pixels.

Relacionado con: gui_strlen.
int gui_strlen(const char *s);
Funci�n de ayuda usada por las rutinas GUI. Devuelve la longitud de una cadena de texto en pixels, ignorando los car�cteres '&'.
Relacionado con: gui_textout.
void position_dialog(DIALOG *dialog, int x, int y);
Mueve un array de objetos de di�logo a la posici�n de pantalla especificada (indicando la esquina superior izquierda del di�logo).
Relacionado con: centre_dialog.
void centre_dialog(DIALOG *dialog);
Mueve un array de di�logos de objetos para que est�n centrados en la pantalla.
Relacionado con: set_dialog_color.
void set_dialog_color(DIALOG *dialog, int fg, int bg);
Pone el color de primer plano y fondo de un array de di�logo de objetos.
Relacionado con: gui_fg_color, gui_mg_color, centre_dialog.
int find_dialog_focus(DIALOG *dialog);
Busca el di�logo para el objeto que tiene el foco de entrada, devolviendo un �ndice o -1 si no hay foco de entrada. Esto es �til cuando est� llamando a do_dialog() varias veces seguidas y quiere dejar el foco de entrada en el mismo lugar que cuando se ense�o el di�logo la ultima vez, por lo que pueda llamar a do_dialog(dlg, find_dialog_focus(dlg));
Relacionado con: do_dialog, init_dialog, offer_focus.
int offer_focus(DIALOG *d, int obj, int *focus_obj, int force);
Ofrece el foco de entrada a un objeto particular. Normalmente esta funci�n env�a el mensaje MSG_WANTFOCUS para preguntar si el objeto desea aceptar el foco. Pero si pasa un valor distinto de cero como argumento force, estr� indicando a la funci�n que el objeto debe tener el foco de entrada.
Relacionado con: find_dialog_focus.
int object_message(DIALOG *dialog, int msg, int c);
Env�a un mensaje a un objeto y devuelve la respuesta generada. Recuerde que el primer par�metro es el objeto del di�logo (no el array completo) al que desea enviar el mensaje. Por ejemplo, para hacer que el segundo objeto del di�logo se dibuje, podr�a escribir:
      object_message(&dialog[1], MSG_DRAW, 0);
Relacionado con: dialog_message.
int dialog_message(DIALOG *dialog, int msg, int c, int *obj);
Manda un mensaje a todos los objetos de un array. Si alguno de los procesos de di�logo devuelve otro valor que no sea D_O_K, la funci�n devuelve el valor y hace apuntar a obj al �ndice del objeto que produjo ese mensaje.
Relacionado con: object_message, broadcast_dialog_message.
int broadcast_dialog_message(int msg, int c);
Manda un mensaje a todos los objetos del di�logo activo. Si cualquiera de los procesos de di�logo devuelve otros valores que no sean D_O_K, devuelve ese valor.
Relacionado con: dialog_message, active_dialog.
int do_dialog(DIALOG *dialog, int focus_obj);
La funci�n b�sica del gestor de di�logo. Esta ense�a el di�logo (un array de objetos de di�logo, acabados por uno con el proceso de di�logo puesto a NULL), y pone el foco de entrada a focus_obj (-1 si no quiere que nada tenga el foco de entrada). La funci�n interpreta la entrada del usuario y despacha mensajes a medida que se requiera, hasta que uno de los procesos de di�logo le dice que lo cierre. Entonces devuelve el �ndice del objeto que caus� el cierre.
Relacionado con: find_dialog_focus, popup_dialog, init_dialog, centre_dialog, set_dialog_color.
int popup_dialog(DIALOG *dialog, int focus_obj);
Como do_dialog(), pero almacena los datos de la pantalla antes de dibujar el di�logo y los recupera cuando el di�logo es cerrado. El �rea de pantalla a guardar es calculada seg�n las dimensiones del primero objeto en el di�logo, por lo que el resto de los objetos deben estar dentro de �l.
Relacionado con: do_dialog.
DIALOG_PLAYER *init_dialog(DIALOG *dialog, int focus_obj);
Esta funci�n da acceso de bajo nivel a la misma funcionalidad que do_dialog(), pero le permite combinar la caja de di�logo con sus propias estructuras de objeto. Inicializa un di�logo, devolviendo un puntero al objeto reproductor que puede ser usado con update_dialog() y shutdown_dialog(). Con estas funciones, puede implementar su propia versi�n de do_dialog() con las l�neas:
      DIALOG_PLAYER *player = init_dialog(dialog, focus_obj);

      while (update_dialog(player))
         ;

      return shutdown_dialog(player);
Relacionado con: update_dialog, shutdown_dialog, do_dialog.
int update_dialog(DIALOG_PLAYER *player);
Actualiza el estado de un di�logo de objeto devuelto por init_dialog(). Devuelve TRUE si el di�logo sigue activo, o FALSE si se ha cerrado. Si devuelve FALSE, depende de usted llamar a shutdown_dialog() o continuar con la ejecuci�n. El objeto que requiri� la salida puede ser determinado desde el campo player->;obj.
Relacionado con: init_dialog.
int shutdown_dialog(DIALOG_PLAYER *player);
Destruye el player de di�logo de objeto devuelto por init_dialog(), devolviendo el objeto que caus� la salida (esto es lo mismo que el valor de do_dialog()).
Relacionado con: init_dialog.
extern DIALOG *active_dialog;
Puntero global al di�logo activado m�s recientemente. Esto puede ser �til si un objeto necesita recorrer la lista de di�logos "hermanos".
Relacionado con: do_dialog, init_dialog, broadcast_dialog_message.

Menus gui

Los men�s emergentes o desplegables son creados como un array de la estructura:

   typedef struct MENU
   {
      char *text;            - texto a visualizar por el �tem del men�
      int (*proc)();         - llamado cuando el �tem del men� es
                               seleccionado
      struct MENU *child;    - men� hijo anidado
      int flags;             - estado seleccionado o deseleccionado
      void *dp;              - puntero a datos que necesite
   } MENU;
Cada �tem del men� contiene una cadena de texto. Puede usar el caracter '&' para indicar el atajo del teclado, o puede ser una cadena de texto de tama�o cero para visualizar el �tem como una barra divisoria no seleccionable. Si la cadena contiene un caracter de tabulaci�n "\t", el texto que sigue ser� justificado a la derecha, por ejemplo para ense�ar informaci�n sobre el atajo del teclado. El puntero proc es una funci�n que ser� llamada cuando el �tem del men� sea seleccionado, y child apunta a otro men�, permiti�ndole hacer men�s anidados. proc y child pueden ser ambos NULL. La funci�n proc devuelve un entero que es ignorado si el men� fue llamado por do_menu(), pero que es devuelto al gestor de di�logo si fue creado por un objeto d_menu_proc(). El array de �tems del men� se cierra con una entrada con el campo text puesto a NULL.

Los �tems del men� pueden ser deseleccionados (en gris) activando el bit D_DISABLED en el campo flags, y pueden ense�ar un s�mbolo de marcado si se activa el bit D_SELECTED. Con la alineaci�n y fuente por defecto, la marca sobreescribir�a el texto del men�, por lo que si va a usar �tems de men� con s�mbolo de marca, seria una buena idea prefijar todas sus opciones con un caracter de espacio o dos, para estar seguro de que hay suficiente sitio para el s�mbolo de marcado.

Relacionado con: do_menu, d_menu_proc, gui_menu_draw_menu.
int do_menu(MENU *menu, int x, int y)
Ense�a y anima el men� emergente en la pantalla en las coordenadas especificadas (estas ser�n ajustadas si el men� no entra enteramente en la pantalla). Devuelve el �ndice del �tem de men� seleccionado, o -1 si el men� fue cancelado. F�jese que el valor de retorno no puede indicar una selecci�n de men�s hijo, por lo que tendr� que usar funciones "callback" si quiere men�s multi-nivel.
Relacionado con: Menus gui, d_menu_proc, active_menu, gui_menu_draw_menu.
extern MENU *active_menu;
Cuando se activa una llamada de vuelta, esta variable ser� puesta al valor del �tem seleccionado, para que su rutina pueda determinar desde d�nde fue llamada.
Relacionado con: Menus gui.
extern void (*gui_menu_draw_menu)(int x, int y, int w, int h);
extern void (*gui_menu_draw_menu_item)(MENU *m, int x, int y, int w, int h, int bar, int sel);
Si las ajusta, estas funciones ser�n llamadas cuando un men� necesite ser dibujado, por lo que puede cambiar el aspecto de los men�s.

A gui_menu_draw_menu() se le pasar� la posici�n y tama�o del men�. Deber�a dibujar el fondo del men� en la pantalla (screen).

gui_menu_draw_menu_item() ser� llamado una vez por cada elemento del men� que debe ser dibujado. bar ser� distinto de cero si el elemento es parte de una barra de men� horizontal del nivel superior, y sel ser� distinto de cero si el elemento del men� est� seleccionado. Tambi�n deber�a ser dibujado en la pantalla (screen).

Relacionado con: Menus gui.
int alert(const char *s1, *s2, *s3, const char *b1, *b2, int c1, c2);
Ense�a una caja de alerta emergente, conteniendo tres l�neas de texto (s1-s3), y con uno o dos botones. El texto de los botones se pasa en b1 y b2 (b2 puede ser NULL), y los atajos de teclado se pasan en c1 y c2. Devuelve 1 o 2 dependiendo de que bot�n fue pulsado. Si la alerta se aborta pulsando ESC cuando ESC no es uno de los atajos del teclado, se trata como si se hubiese pulsado el segundo bot�n (esto es consistente con la t�pica alerta "Ok", "Cancelar").
Relacionado con: alert3, gui_fg_color.
int alert3(const char *s1, *s2, *s3, const char *b1, *b2, *b3, int c1, c2, c3);
Como alert(), pero con tres botones. Devuelve 1, 2, o 3.
Relacionado con: alert, gui_fg_color.
int file_select(const char *message, char *path, const char *ext);
Deprecado. Use file_select_ex() en su lugar, pasando las dos constantes OLD_FILESEL_WIDTH y OLD_FILESEL_HEIGHT si desea que el selector de ficheros sea visualizado con las dimensiones del antiguo selector.
Relacionado con: file_select_ex, gui_fg_color.
int file_select_ex(const char *message, char *path, const char *ext, int size, int w, int h);
Visualiza el selector de ficheros de Allegro, con la cadena message como t�tulo. El par�metro path contiene el nombre del fichero inicial a visualizar (esto puede ser usado como el comienzo del directorio, o para dar un nombre por defecto a un salvar-como). La selecci�n del usuario se devuelve alterando el buffer path, cuya longitud m�xima en bytes est� indicada por el par�metro size. Recuerde que deber�a tener como m�nimo espacio para 80 car�cteres (no bytes), por lo que deber�a reservar seis veces esa cantidad, para asegurarse. La lista de ficheros es filtrada de acuerdo con las extensiones de ficheros en ext. Pasar NULL incluye todos los ficheros, "PCX;BMP" incluye solamente los ficheros con extensiones .PCX o .BMP. Si desea controlar los ficheros por sus atributos, uno de los campos de la lista de extensiones puede empezar con una barra, seguida por un conjunto de car�cteres de atributos. Cualquier atributo escrito solo, o con un '+' antes de �l, indica que s�lo se incluyan ficheros que tengan ese atributo activo. Cualquier atributo con un '-' antes de �l indica que hay que dejar fuera los ficheros con ese atributo. Los atributos son 'r' para s�lo lectura (read-only), 'h' para ocultos (hidden), 's' para archivos de sistema (system), 'd' para directorios (directory), y 'a' para tipo archivo (archive). Por ejemplo, una cadena de extension "PCX;BMP;/+r-d" mostrar� solamente ficheros PCX o BMP que sean de s�lo lectura pero no los directorios. El di�logo del selector de ficheros ser� reescalado a la anchura y altura especificadas y al tama�o de la fuente. Si alguno de los par�metros est� a cero, entonces la funci�n escalar� el di�logo a la dimensi�n apropiada de la pantalla. Devuelve cero si fue cerrada con el bot�n Cancelar, y distinto de cero si se cerr� con OK.
Relacionado con: gui_fg_color.
int gfx_mode_select(int *card, int *w, int *h);
Ense�a el di�logo de selecci�n de modo gr�fico de Allegro, que permite al usuario seleccionar el modo y tarjeta de v�deo. Almacena la selecci�n en las tres variables, y devuelve cero si se cerr� con el bot�n Cancelar y distinto de cero si se cerr� con OK.
Relacionado con: gfx_mode_select_ex, set_gfx_mode, gui_fg_color.
int gfx_mode_select_ex(int *card, int *w, int *h, int *color_depth);
Versi�n extendida del di�logo de selecci�n de modo gr�fico, que permite al usuario seleccionar tanto el n�mero de colores como la resoluci�n y el controlador de v�deo. Esta versi�n de la funci�n lee los valores iniciales de los par�metros cuando se activa, por lo que puede especificar los valores por defecto.
Relacionado con: gfx_mode_select, set_color_depth, set_gfx_mode, gui_fg_color.
extern int (*gui_shadow_box_proc)(int msg, struct DIALOG *d, int c);
extern int (*gui_ctext_proc)(int msg, struct DIALOG *d, int c);
extern int (*gui_button_proc)(int msg, struct DIALOG *d, int c);
extern int (*gui_edit_proc)(int msg, struct DIALOG *d, int c);
extern int (*gui_list_proc)(int msg, struct DIALOG *d, int c);
extern int (*gui_text_list_proc)(int msg, struct DIALOG *d, int c);
Si ajusta alguno de estos punteros, las funciones a las que apunten ser�n usadas por los di�logos est�ndar de Allegro. Esto le permite personalizar el `look and feel', al estilo de gui_fg_color y gui_bg_color, pero con mucha mayor flexibilidad.
Relacionado con: alert, alert3, file_select, gfx_mode_select, gui_fg_color.

Volver al Indice