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:
El array debe acabar con un objeto que tiene el proceso de di�logo puesto a NULL.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 campo de bits puede contener cualquier combinaci�n de los siguientes bits:
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: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
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.int foo(int msg, DIALOG *d, int c);
El proceso del di�logo deber�a devolver uno de los siguientes valores:
Los procesos de di�logo se pueden llamar con cualquiera de estos mensajes: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
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:
Cuando quiera convertir di�logos antiguos para que visualmente sean iguales al compilar con la nueva versi�n de Allegro, simplemente incremente el tama�o un pixel en los campos de anchura y altura.d_box_proc, d_shadow_box_proc, d_button_proc, d_check_proc, d_radio_proc, d_list_proc, d_text_list_proc and d_textbox_proc.
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:
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.char *foobar(int index, int *list_size);
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:
El objeto d_slider_proc devolver� el valor de la funci�n callback.int function(void *dp3, int d2);
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);
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;
Relacionado con: gui_fg_color, set_dialog_color.extern int gui_font_baseline;
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.
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);
Relacionado con: gui_textout.void position_dialog(DIALOG *dialog, int x, int y);
Relacionado con: centre_dialog.void centre_dialog(DIALOG *dialog);
Relacionado con: set_dialog_color.void set_dialog_color(DIALOG *dialog, int fg, int bg);
Relacionado con: gui_fg_color, gui_mg_color, centre_dialog.int find_dialog_focus(DIALOG *dialog);
Relacionado con: do_dialog, init_dialog, offer_focus.int offer_focus(DIALOG *d, int obj, int *focus_obj, int force);
Relacionado con: find_dialog_focus.int object_message(DIALOG *dialog, int msg, int c);
object_message(&dialog[1], MSG_DRAW, 0);
Relacionado con: dialog_message.int dialog_message(DIALOG *dialog, int msg, int c, int *obj);
Relacionado con: object_message, broadcast_dialog_message.int broadcast_dialog_message(int msg, int c);
Relacionado con: dialog_message, active_dialog.int do_dialog(DIALOG *dialog, int focus_obj);
Relacionado con: find_dialog_focus, popup_dialog, init_dialog, centre_dialog, set_dialog_color.int popup_dialog(DIALOG *dialog, int focus_obj);
Relacionado con: do_dialog.DIALOG_PLAYER *init_dialog(DIALOG *dialog, int focus_obj);
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);
Relacionado con: init_dialog.int shutdown_dialog(DIALOG_PLAYER *player);
Relacionado con: init_dialog.extern DIALOG *active_dialog;
Relacionado con: do_dialog, init_dialog, broadcast_dialog_message.
Los men�s emergentes o desplegables son creados como un array de la estructura:
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.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;
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)
Relacionado con: Menus gui, d_menu_proc, active_menu, gui_menu_draw_menu.extern MENU *active_menu;
Relacionado con: Menus gui.extern void (*gui_menu_draw_menu)(int x, int y, int w, int h);
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);
Relacionado con: alert3, gui_fg_color.int alert3(const char *s1, *s2, *s3, const char *b1, *b2, *b3, int c1, c2, c3);
Relacionado con: alert, gui_fg_color.int file_select(const char *message, char *path, const char *ext);
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);
Relacionado con: gui_fg_color.int gfx_mode_select(int *card, int *w, int *h);
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);
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);
Relacionado con: alert, alert3, file_select, gfx_mode_select, gui_fg_color.