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 useCada 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 teclaLos 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);int update_dialog(DIALOG_PLAYER *player);while (update_dialog(player));
return shutdown_dialog(player);
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.