Editor de menús


Disponible a través del menú Herramientas-->Editor de menús o cuando se agrega un recurso de menú (Proyecto-->Agregar Recurso-->Menú).

Muestra la ventana que puede verse más abajo y le permite diseñar un menú para el objeto ventana que esté activo (sólo en los proyectos visuales). Cuando el Editor de menús se abre para un menú diseñado como un recurso (vea Recursos), la opción Acelerador no está disponible porque los Recursos tienen su propio diseñador de Aceleradores.

En los proyectos visuales, cada objeto ventana puede tener un objeto menú. Este objeto menú es el menú de nivel superior (top menu) que se asigna al objeto ventana (el que se indica en la cabecera del Editor de menús) y no se muestra en la barra de menú (digamos que el mísmo es la barra de menú). Un objeto menú es un menú popup, que puede tener otros menús popup dentro de él. Por otra parte, dentro de los menús popup puede haber ítems de menú u otros menús popup. Los menús popup que están en el primer nivel, es decir, que son directamente hijos del objeto menú, serán mostrados en la barra de menú. Los otros menús popup o ítems de menú sólo se ven cuando se hace clic en su menú popup padre. Un menú popup no tiene identificador porque no envia mensajes WM_COMMAND a la "owner window". Los ítems de menú se muestran cuando se hace clic en su menú popup padre y sí que tienen un identificador o ID. Una vez que se muestran, podemos hacer clic en cualquier menú ítem para llevar a cabo una acción. Cuando se hace clic en un menú ítem, se envia un mensaje WM_COMMAND con su valor ID en la palabra baja ("low word") del parámetro wParam (la palabra alta, "high word", de wParam es 0). La ventana que recibe el mensaje es la ventana que tiene el menú asignado. Podemos obtener fácilmente el nombre constante de cada item de menú simplemente aplicando la siguiente norma:

La constante ID de un ítem de menú está formada por 'IDM_' mas el nombre del objeto ventana, mas '_', mas el texto que haya escrito en el cuadro de texto ID (este cuadro de texto no está disponible para menús popup y separadores). Por ejemplo, supongamos que hemos escrito SALIR como ID de un ítem que está dentro del objeto menú que pertenece a la ventana llamada wndMain. El nombre constante para este ítem de menú será (todo mayúsculas):

IDM_WNDMAIN_SALIR

Por defecto, Easy Code asigna cada menú a su "owner window" (la que se indica en la cabecera del Editor de menús en tiempo de diseño). El nombre de esta "owner window" se utiliza para formar la constante ID. Si asigna un menú a cualquier otra ventana a lo largo del código (función de la API SetMenu), los mensajes WM_COMMAND se enviarán a la nueva "owner window" del menú, pero su constante ID NO CAMBIARÁ. Por lo tanto, debe utilizar esta constante ID a lo largo de todo el código para el ítem de menú en cuestión, por ejemplo cuando se escribe el código del mensaje WM_COMMAND en la ventana que tiene el objeto menú asignado:

.ElseIf uMsg == WM_COMMAND
    ; Obtener la "low word" de wParam (se necesita para que funcionen los aceleradores)
    LoWord wParam
    .If Ax == IDM_WNDMAIN_SALIR
        ......
        Hacer alguna operación...
        ······
        Return
TRUE
    .EndIf
.EndIf

En el Editor de menús, una linea puede ser un menú popup sólo cuando tiene ítems de menú, es decir, cuando al menos la linea inmediatamente siguiente tiene un tabulador mas (>>). Haciendo clic en los botones (>>) y (<<) puede diseñar un menú. Cada ítem de menú puede estar marcado, deshabilitado, o ambas cosas, y puede tener un acelerador. Un acelerador es la tecla (o comibnación de teclas) que lleva a cabo la misma acción que hacer clic en elítem de menú. Por ejemplo, en la mayoría de aplicaciones, pulsar la tecla <F1> es lo mismo que abrir el menú Ayuda y hacer clic en elítem de menú Ver ayuda. Para aquellos ítems de menú que desee que aparezcan como separadores, escriba sólo un guión (-) en su texto (el cuadro de texto llamado Texto). Por ejemplo, supongamos que tenemos las siguientes lineas:

&Archivo
    >>&Abrir
    >>&Cerrar
    >>-
    >>Salir

La primera linea (&Archivo) es un menú popup (porque las cuatro lineas siguientes tienen un tabulador mas >>). Puesto que está en el primer nivel (no tiene tabuladores), aparecerá en la barra de menú. Cuando se haga clic sobre él, se mostrarán sus cuatro ítems de menú. El tercer ítem (cuarta linea) es un separador. Los separadores no hacen otra cosa que separar las opciones. Por otra parte, observe que los ampersands (&) no son visibles en los menús popup o items de menú en tiempo de ejecución, pero hacen que el carácter inmediatamente a continuación del ampersand aparezca subrayado.

Ahora supongamos que queremos añadir otro menú popup, digamos por ejemplo, Edición. Deberemos añadir las siguientes lineas (las lineas añadidas en letra negrita):

&Archivo
    >>&Abrir
    >>&Cerrar
    >>-
    >>Salir
&Edición
    >>&Copiar
    >>Cor&tar
    >>&Pegar
    >>&Eliminar

Como puede ver, la sexta linea (&Edición) está en el mismo nivel que la primera (&Archivo) y tiene items de menú, por lo tanto es un menú popup. Puesto que también está en el primer nivel, aparecerá en la barra de menú que se verá mas o menos así:

Archivo   Edición

Después de crear un objeto menú, es fácil escribir código para sus ítems de menú utilizando sus nombres de constante. Para los ítems de menú del ejemplo anterior, supongamos que hemos asignado (en el cuadro de texto llamado ID) los siguientes ID's (recuerde que los menús popup y los separadors no tienen ID):

&Abrir    ID:  ABRIR
&Cerrar   ID:  
CERRAR
&Salir    ID:  
SALIR

&Copiar   ID:  
COPIA
Cor&tar   ID:  
CORTAR
&Pegar    ID:  
PEGAR
&Eliminar ID:  ELIMINAR

Puesto que el objeto menú (top menu) pertenece a la ventana llamada wndMain, todos estos ítems de menú tendrán, respectivamente, los siguientes nombres de constante ID:

IDM_WNDMAIN_ABRIR
IDM_WNDMAIN_CERRAR
IDM_WNDMAIN_SALIR

IDM_WNDMAIN_COPIAR
IDM_WNDMAIN_CORTAR
IDM_WNDMAIN_PEGAR
IDM_WNDMAIN_ELIMINAR

Además, a cada ítem de menú se le puede asignar (o no) una tecla aceleradora utilizando el "combo box" llamado Acelerador. Cuando se asigna al menos un accelerador, Easy Code crea una tabla de Aceleradores. Puede conseguir el "handle" de esa tabla, en tiempo de ejecución, a través del objeto App.Accel, aunque normalmente no se necesita por que Easy Code también se cuida de los aceleradores (sólo en modo visual).

Cuando trabaje con aplicaciones MDI (vea Aplicaciones MDI), tenga en cuenta que cada ventana MDI hija que se activa, asigna su menú (si lo tiene) a la ventana MDI frame. El MDI frame (un objeto MDIWindow) será entonces el propietario de ese menú, por lo tanto los mensajes de los ítems de menú se enviarán al MDI frame, no a la ventana MDI hija que originalmente era la propietaria del menú. Esto no afecta para nada a los nombres de constante ID de los ítems de menú, que continuan siendo los mismos. Cuando la MDI hija se desactiva, se le vuelve a asignar su menú y entonces el MDI frame recibe el menú de la nueva ventana MDI hija activa.

IMPORTANTE: Cuando el cuadro de verificación Owner draw está seleccionado, el ítem de menú correspondiente no es dibujado por Windows, sino que se envía un mensaje WM_DRAWITEM a la ventana padre para que el ítem de menú sea dibujado por la aplicación.

NOTA: Todo lo que acabamos de ver sólo es válido para los proyectos visuales. Cuando el Editor de menús se abre para un menú diseñado como recurso, el ID de cada ítem será exactamente el nombre que se haya indicado en el cuadro de texto ID, y los aceleradores deberán asignarse de la manera clásica, es decir, creando una tabla de aceleradores donde se relacione cada combinación de teclas con el ítem de menú correspondiente.

OBSERVACIONES: Con el fin de ser todavia mas flexibles, los menús (popup y ítems) aceptan IDentificadores de cadena en su Texto (vea Recursos).