30 Rutinas GUI



Allegro posee un m�nager 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 dialogo 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 de dialogo (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;                       - biestable sobre 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 dialogo puesto a NULL.

El campo de biestables puede contener cualquiera de los siguientes biestables de bits o una combinaci�n de ellos.

   D_EXIT          - este objeto debe cerrar el dialogo al activarse
   D_SELECTED      - este objeto esta seleccionado
   D_GOTFOCUS      - este objeto tiene el foco de entrada
   D_GOTMOUSE      - el rat�n esta actualmente encima del objeto
   D_HIDDEN        - este objeto esta oculto e inactivo
   D_DISABLED      - este objeto esta de color gris e inactivo
   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 m�nager de di�logos cuando se produzca alguna acci�n que involucre al objeto, o puede llamarlo directamente con la macro SEND_MESSAGE. El proceso de di�logo debe seguir la siguiente forma:

   int foo(int msg, DIALOG *d, int c);

Se le pasar� un biestable (msg) indicando que 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 dialogo entero.

El dialogo deber�a devolver uno de los valores siguientes:

   D_O_K          - estado normal de retorno
   D_CLOSE        - le dice al m�nager de di�logos que cierre el dialogo
   D_REDRAW       - le dice al m�nager de di�logos que redibuje el dialogo
   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 dialogo se pueden llamar con cualquiera de estos mensajes:

MSG_START:
Le dice al objeto que se inicialice. El m�nager de dialogo manda esto a todos los objetos del dialogo justo antes de mostrarlo.

MSG_END:
Se manda a todos los objetos cuando se cierra un dialogo, 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. Si el foco trata con la pulsaci�n de teclas, deber�a retornar D_USED_CHAR, en caso contrario deber�a retornar D_O_K para permitir operar al interfaz de teclado por defecto.

MSG_XCHAR:
Cuando se pulsa una tecla, Allegro mandara MSG_CHAR al objeto que tenga el foco de entrada. Si este objeto no procesa la entrada (ya que por ejemplo retorna D_O_K en vez de D_USED_CHAR), el m�nager de dialogo mirara si hay alg�n dialogo con que se corresponda la tecla pulsada, y le manda un MSG_KEY. Si esto falla, mandara un MSG_XCHAR al resto de los objetos del dialogo permiti�ndoles responder a pulsaciones de tecla especiales incluso cuando no tienen el foco de entrada. Normalmente deber�a ignorar este mensaje (devuelve D_O_K en vez de D_USED_CHAR), con lo cual Allegro realizara las acciones por defecto como mover el foco de entrada en respuesta a los cursores y cerrar el dialogo si se pulsa ESC.

MSG_WANTFOCUS:
Determina si un objeto quiere recibir el foco de entrada. Deber� retornar D_WANTFOCUS si lo hace, 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 dialogo de m�nager no tiene nada mejor que hacer.

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

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 dialogo 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.

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 dialogo.

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);
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. Todos los caracteres '&' de la cadena ser�n reemplazados por l�neas debajo del siguiente caracter, 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 biestable D_EXIT, el seleccionarlo provocara el cierre del dialogo. Si no, encender� y apagar� el dialogo. 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);
Esto es un ejemplo de c�mo puede derivar objetos de otros objetos. La mayor�a de su funcionalidad viene de d_button_proc(), pero se visualiza como una recuadro a marcar.

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 llamara a la funci�n apuntada por dp. Esto deber�a retornar un int, el cual se pasara de vuelta al m�nager 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 caracteres 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 de 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 biestable D_EXIT est� puesto, 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 retornar NULL y en list_size debe poner el n�mero de �tems de la lista.

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

int d_textbox_proc(int msg, DIALOG *d, int c);
Un objeto de 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 biestablea 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, en el 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 cambia. La funci�n callback deber�a seguir el prototipo:

      int function(void *dp3, int d2);

El objeto d_slider_proc retornar� 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. 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 m�nager de di�logo, para que las funciones de sus men�s puedan devolver D_O_K, D_REDRAW, o D_CLOSE.

El comportamiento del m�nager 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.

extern int gui_mg_color;
El color usado para ense�ar los di�logos en gris (los que tienen el biestable D_DISABLED activado). Por defecto es 8.

extern int gui_font_baseline;
Si se pone a cero, ajusta los subrayados de los atajos de teclado para que igualen la altura de bajada de su texto *** No he sabido traducir esto. *** If set to a non-zero value, adjusts the keyboard shortcut underscores to account for the height of the descenders in your font.

extern int (*gui_mouse_x)();
extern int (*gui_mouse_y)();
extern int (*gui_mouse_b)();
Funciones de gancho, 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 y mouse_b, pero pueden ser usadas para 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 los di�logos file_select() y gfx_mode_select() aparecer�n mal con cualquier cosa que no sean fuentes de 8x8.

int gui_textout(BITMAP *bmp, unsigned 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. Retorna el ancho de la cadena en pixels.

int gui_strlen(unsigned char *s);
Funci�n de ayuda usada por las rutinas GUI. Retorna la longitud de una cadena de texto en pixels, ignorando los caracteres '&'.

void centre_dialog(DIALOG *dialog);
Mueve un array de di�logos de objetos para que est�n centrados en la pantalla.

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.

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));

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.

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 retorna otros valores que no sean D_O_K, devuelve ese valor.

int do_dialog(DIALOG *dialog, int focus_obj);
La funci�n b�sica del m�nager 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 retorna el �ndice del objeto que caus� el cierre.

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.

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 de player 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:

      void *player = init_dialog(dialog, focus_obj);

while (update_dialog(player));

return shutdown_dialog(player);

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.

int shutdown_dialog(DIALOG_PLAYER *player);
Destruye el player de di�logo de objeto retornado por init_dialog(), devolviendo el objeto que caus� la salida (esto es lo mismo que el valor de do_dialog()).

extern DIALOG *active_dialog;
Puntero global al di�logo activado mas recientemente. Esto puede ser �til si un objeto necesita itererar *** Esto no lo se traducir *** Global pointer to the most recent activated dialog. This may be useful if an object needs to iterate through a list of all its siblings.


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 m�nager 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.

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). Retorna 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.

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.

int alert(char *s1, *s2, *s3, 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").

int alert3(char *s1, *s2, *s3, char *b1, *b2, *b3, int c1, c2, c3);
Como alert(), pero con tres botones. Devuelve 1, 2, o 3.

int file_select(char *message, char *path, char *ext);
Visualiza el selector de ficheros de allegro, con el mensaje como "caption". El par�metro path contiene el nombre del fichero inicial a visualizar (esto se puede usar como el comienzo del directorio, o para dar un nombre por defecto a una operaci�n salvar-como) La selecci�n del usuario es devuelta alterando el path, por lo que debe tener espacio para al menos 80 caracteres. La lista de ficheros es filtrada seg�n las extensiones en ext. Pasando NULL incluye todos los ficheros, "PCX;BMP" incluye solo ficheros con extensi�n .PCX o .BMP. Devuelve cero si se cerr� con el bot�n Cancelar, y no-cero si se cerr� con OK.

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 no-cero si se cerr� con OK.

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.




Volver al Indice