A primera vista, la barra de menús de Microsoft Internet Explorer 5 y versiones posteriores es similar a un menú estándar. Sin embargo, tiene un aspecto bastante diferente al empezar a usarlo.
En la captura de pantalla siguiente se muestra la barra de menús de Windows Internet Explorer con el menú Herramientas seleccionado.
La barra de menús es realmente un control de barra de herramientas que tiene un aspecto similar a un menú estándar. En lugar de los elementos de menú de nivel superior, una barra de menús tiene una serie de botones de solo texto que muestran un menú desplegable cuando se hace clic en él. Sin embargo, como tipo especializado de barra de herramientas, una barra de menús tiene algunas funcionalidades que carecen de menús estándar:
- Se puede personalizar mediante técnicas de barra de herramientas estándar, lo que permite al usuario mover, eliminar o agregar elementos.
- Puede tener seguimiento frecuente, de modo que los usuarios sepan cuándo están por encima de un elemento de nivel superior sin tener que hacer clic en él primero.
Se puede incorporar una barra de menús en un control rebar, lo que le proporciona las siguientes características:
- Puede tener una pinza, lo que permite al usuario mover o cambiar el tamaño de la banda.
- Puede compartir una franja en el control de barra con otras bandas, como la barra de herramientas estándar de la ilustración anterior.
- Puede mostrar un botón de contenido adicional cuando está cubierto por una banda adyacente, lo que proporciona al usuario acceso a los elementos ocultos.
- Puede tener un mapa de bits de fondo definido por la aplicación.
En este tema se describe cómo implementar una barra de menús. Puesto que una barra de menús es una implementación especializada de un control de barra de herramientas, el foco estará en temas específicos de las barras de menús. Para obtener una explicación sobre cómo incorporar una barra de herramientas en un control de barra de barras, vea How to Create an Internet Explorer-Style Toolbar and About Rebar Controls.
Convertir una barra de herramientas en una barra de menús
Para convertir una barra de herramientas en una barra de menús:
- Cree una barra de herramientas plana incluyendo TBSTYLE_FLAT con las demás marcas de estilo de ventana. El estilo TBSTYLE_FLAT también habilita el seguimiento frecuente. Con este estilo, la barra de menús se parece mucho a un menú estándar hasta que el usuario activa un botón. A continuación, el botón parece destacar de la barra de herramientas y deprimente cuando se hace clic en él, al igual que un botón estándar. Dado que el seguimiento activo está habilitado, todo lo que es necesario para activar un botón es para que el cursor mantenga el puntero sobre él. Si el cursor se mueve a otro botón, se activará y se desactivará el botón anterior.
- Cree botones de estilo de lista incluyendo TBSTYLE_LIST con las demás marcas de estilo de ventana. Este estilo crea un botón más delgado que se parece más a un elemento de menú de nivel superior estándar.
- Haga que los botones sean de solo texto estableciendo el miembro iBitmap de la estructura TBBUTTON del botón en I_IMAGENONE y el miembro iString en el texto del botón.
- Asigne a cada botón el estilo BTNS_DROPDOWN . Cuando se hace clic en el botón, el control de la barra de herramientas envía a la aplicación una notificación de TBN_DROPDOWN para solicitarla para mostrar el menú del botón.
- Incorpore la barra de menús en una banda de barras. Habilite tanto las pinzas como los marcadores de contenido adicional, tal y como se describe en How to Create an Internet Explorer-Style Toolbar(Cómo crear una barra de herramientas de Internet Explorer-Style).
- Implemente un controlador de TBN_DROPDOWN para mostrar el menú desplegable del botón cuando se hace clic en él. El menú desplegable es un tipo de menú emergente. Se crea mediante la función TrackPopupMenu , con su esquina superior izquierda alineada con la esquina inferior izquierda del botón.
- Implemente la navegación por el teclado para que la barra de menús sea totalmente accesible sin un mouse.
- Implemente el seguimiento frecuente del menú. Con los menús estándar, una vez que se muestra el menú de un elemento de menú de nivel superior, al mover el cursor sobre otro elemento de nivel superior se muestra automáticamente su menú y se contrae el menú del elemento anterior. El control de la barra de herramientas realizará un seguimiento activo del cursor y cambiará la imagen del botón, pero mostrará automáticamente el nuevo menú. La aplicación debe hacerlo explícitamente.
La mayoría de estos elementos son sencillos de implementar y se tratan en otro lugar. Vea How to Create an Internet Explorer-Style Toolbar, About Toolbar Controls, or About Rebar Controls (Cómo crear una barra de herramientas de Internet Explorer-Style Toolbar), About Toolbar Controls (Acerca de los controles de barra de herramientas) o About Rebar Controls (Acerca de los controles de barra de herramientas) para obtener una explicación general de cómo usar barras de herramientas y controles de rebar. Consulta Menús para obtener información sobre cómo controlar los menús emergentes. En el resto de este tema se describen los dos elementos finales, la navegación por teclado y el seguimiento frecuente del menú.
Controlar la navegación con el menú Hot-Tracking deshabilitado
Los usuarios pueden elegir navegar por la barra de menús con el mouse, el teclado o una mezcla de ambos. Para implementar la navegación de la barra de menús, la aplicación debe controlar las notificaciones de la barra de herramientas y supervisar el mouse y el teclado. Esta tarea se puede dividir en dos partes distintas: con y sin seguimiento frecuente del menú. En esta sección se describe cómo controlar la navegación cuando no se muestran menús y el seguimiento frecuente del menú no está habilitado.
Navegación por el mouse
Si el seguimiento frecuente del menú está deshabilitado, puede tratar una barra de menús como una barra de herramientas normal. Si el usuario navega con un mouse, toda la aplicación debe controlar la notificación TBN_DROPDOWN . Cuando se reciba esta notificación, muestre el menú desplegable adecuado y habilite el seguimiento rápido del menú. A partir de entonces, se encuentra en el régimen de seguimiento activo del menú que se describe en Control de navegación con menú Hot-Tracking Habilitado.
Como se describe en Navegación mixta, también debe controlar la notificación de TBN_HOTITEMCHANGE para realizar un seguimiento del botón activo. Esta notificación es irrelevante si el usuario solo navega con el mouse, pero es necesario cuando se mezclan la navegación por el mouse y el teclado.
Navegación mediante teclado
Como se indicó en la sección anterior, el usuario puede realizar varias operaciones de navegación con el teclado cuando el seguimiento rápido del menú está deshabilitado. Los controles de la barra de herramientas solo admiten la navegación mediante teclado si tienen el foco. Tampoco controlan todas las pulsaciones de teclas necesarias para las barras de menú. La solución más sencilla para controlar la navegación mediante teclado es procesar explícitamente los eventos de pulsación de teclas pertinentes.
Si el seguimiento frecuente del menú está deshabilitado, la aplicación debe controlar estos eventos de pulsación de teclas de la siguiente manera:
- Tecla F10. Active el primer botón con TB_SETHOTITEM.
- Teclas FLECHA IZQUIERDA y FLECHA DERECHA. Active el botón adyacente con TB_SETHOTITEM. Si el usuario intenta navegar fuera de cualquiera de los extremos de la barra de menús, active el primer botón en el extremo opuesto.
- Tecla ESCAPE. Desactive el botón activo con TB_SETHOTITEM. La barra de menús debe devolverse al estado que tenía antes de activar el primer botón.
- Tecla de aceleración alt-tecla . Use el mensaje TB_MAPACCELERATOR para determinar a qué botón corresponde el carácter Clave . Muestra el menú desplegable del botón y habilita el seguimiento frecuente del menú.
- Tecla FLECHA ABAJO. Si un botón está activo pero no se ha mostrado ningún menú, muestre el menú del botón y habilite el seguimiento rápido del menú.
- Tecla ENTRAR. Desactive el botón activo con TB_SETHOTITEM. La barra de menús debe devolverse al estado que tenía antes de activar el primer botón.
Navegación mixta
Los controladores de navegación del teclado descritos en la sección anterior básicamente realizan dos tareas: realizar un seguimiento del botón activo y mostrar el menú adecuado cuando se selecciona un botón. Estos controladores son suficientes siempre que el usuario navegue solo con el teclado. Sin embargo, los usuarios suelen mezclar el teclado y la navegación del mouse. Por ejemplo, podrían activar el primer botón con la tecla F10, usar el mouse para activar un botón diferente y, a continuación, abrir su menú con la tecla FLECHA ABAJO. Si solo presiona la tecla de supervisión para realizar un seguimiento de la tecla activa, mostrará el menú incorrecto. También debe controlar la notificación de TBN_HOTITEMCHANGE para realizar un seguimiento preciso del botón activo.
Controlar la navegación con el menú Hot-Tracking habilitado
Cuando el seguimiento rápido del menú está habilitado, la aplicación debe cambiar la forma en que responde a la navegación del usuario. Para replicar el comportamiento de los menús estándar, debe implementar las siguientes características explícitamente.
Con navegación por el mouse:
- Si el usuario mueve el cursor sobre otro botón, ese menú aparece inmediatamente y el menú anterior desaparece.
- El seguimiento activo del menú permanece activo hasta que el usuario selecciona un comando o hace clic en un punto que no forma parte de la región del menú. Cualquiera de las acciones desactiva el seguimiento activo del menú hasta que se hace clic en otro botón.
- Si el cursor se mueve fuera del menú, el menú desplegable actual permanece hasta que el cursor se mueve hacia atrás o el usuario hace clic en un punto fuera, el área cubierta por el menú. Si el cursor vuelve a un botón diferente al que se muestra actualmente, se contrae el menú anterior y se muestra el nuevo menú.
Con navegación por teclado:
La tecla FLECHA DERECHA mueve el foco hacia la derecha. Si el elemento tiene un submenú, muestre el submenú. Si el elemento no tiene un submenú, contraiga el menú y cualquier submenú, active el botón siguiente con TB_SETHOTITEM y muestre el menú del botón adyacente. Si el último botón está activo cuando se recibe este mensaje, muestre el menú del primer botón.
La tecla FLECHA IZQUIERDA mueve el foco a la izquierda. Si el elemento es un submenú, contraigalo y cambie el foco al menú primario. Si el elemento no es un submenú, contraiga el menú, active el botón siguiente con TB_SETHOTITEM y muestre el menú de ese botón.
La tecla ESCAPE vuelve a mostrar un paso.
- Si se muestra un submenú, se contrae y el foco cambia al menú primario.
- Si se muestra el menú de un botón, se contrae y se deshabilita el seguimiento frecuente del menú. El botón del elemento permanece activo.
- Si no se muestran menús pero hay un botón activo, el botón se desactiva y el seguimiento rápido del menú está deshabilitado.
Las teclas FLECHA ARRIBA y FLECHA ABAJO solo se usan para navegar dentro de un menú determinado.
La tecla ENTRAR inicia el comando asociado a un elemento de menú. Si el elemento de menú tiene un submenú, la tecla ENTRAR la muestra.
Al igual que con el caso deshabilitado del seguimiento activo del menú, la aplicación debe ser capaz de controlar el mouse, el teclado y la navegación mixta. Sin embargo, el hecho de que se muestre un menú significa que la mensajería tendrá que controlarse de forma algo diferente.
Procesamiento de mensajes para Hot-Tracking de menús
El seguimiento frecuente del menú requiere que se muestre un menú en todo momento, aparte del breve intervalo necesario para cambiar a un nuevo menú. Sin embargo, el menú desplegable que muestra TrackPopupMenu es modal. La aplicación seguirá recibiendo algunos mensajes directamente, incluidos WM_COMMAND, TBN_HOTITEMCHANGE y mensajes normales relacionados con el menú, como WM_MENUSELECT. Sin embargo, no recibirá mensajes de teclado o mouse de bajo nivel directamente. Para controlar mensajes como WM_MOUSEMOVE, debe establecer un enlace de mensajes para interceptar los mensajes dirigidos al menú.
Cuando se muestra un menú desplegable, establezca el enlace de mensajes llamando a la función SetWindowsHookEx con el parámetro idHook establecido en WH_MSGFILTER. Todos los mensajes destinados al menú se pasarán a messageProc. Por ejemplo, el fragmento de código siguiente establece un enlace de mensajes que interceptará los mensajes que van a un menú desplegable.
MsgHook
es el nombre del procedimiento de enlace y hhookMsg
es el identificador del procedimiento.
hhookMsg = SetWindowsHookEx(WH_MSGFILTER, MsgHook, HINST_THISDLL, 0);
Los mensajes de menú se identifican estableciendo el parámetro nCode del procedimiento de enlace en MSGF_MENU. El parámetro lParam apuntará a una estructura MSG con el mensaje. En el resto de este tema se describen los detalles de los mensajes que se deben controlar y cómo.
La aplicación debe pasar todos los mensajes al enlace de mensajes siguiente mediante una llamada a la función CallNextHookEx . También debe enviar mensajes del mouse directamente al control de la barra de herramientas, asegurándose de convertir las coordenadas de punto en el espacio de coordenadas del cliente de la barra de herramientas. Enviar los mensajes directamente garantiza que el control de la barra de herramientas recibe los mensajes del mouse adecuados. Por ejemplo, la barra de herramientas debe recibir mensajes WM_MOUSEMOVE para realizar un seguimiento rápido de sus botones.
Cuando se activa un nuevo botón, la aplicación debe contraer el menú desplegable anterior con un mensaje de WM_CANCELMODE y mostrar un nuevo menú. También debe contraer el menú desplegable cuando el foco se toma de la barra de menús con navegación mediante teclado o haciendo clic fuera del área de menú. Siempre que contraiga un menú, debe liberar su enlace de mensajes mediante la función UnhookWindowsHookEx . Si necesita mostrar otro menú desplegable, cree un nuevo enlace de mensajes. Cuando se inicia un comando, el menú se contrae automáticamente, pero debe liberar explícitamente el enlace de mensajes.
En el ejemplo de código siguiente se libera el enlace de mensajes que se estableció en el ejemplo anterior.
UnhookWindowsHookEx(hhookMsg);
Navegación por el mouse
Cuando una barra de herramientas normal controla los botones de pista activa, resalta el botón activo y envía a la aplicación una notificación TBN_HOTITEMCHANGE cada vez que se activa un nuevo botón. La aplicación es responsable de mostrar el menú desplegable adecuado. Así, debe:
- Controle la notificación TBN_HOTITEMCHANGE para realizar un seguimiento del botón activo. Cuando cambie el botón activo, contraiga el menú anterior y cree uno nuevo.
- Controle la notificación TBN_DROPDOWN que se envía cuando se hace clic en un botón. A continuación, debe contraer el menú y deshabilitar el seguimiento frecuente del menú. El botón permanece activo.
- Controle los mensajes de WM_LBUTTONDOWN, WM_RBUTTONDOWN y WM_MOUSEMOVE en el procedimiento de enlace de mensajes para realizar un seguimiento de la posición del mouse. Si se hace clic en el mouse fuera del área de menú, contraiga el menú desplegable actual, desactive el seguimiento activo del menú y devuelva la barra de menús a su estado de activación.
- Cuando se inicia un comando de menú, deshabilite el seguimiento activo del menú. El menú se contrae automáticamente, pero debe liberar explícitamente el enlace de mensajes.
También debe controlar la mensajería relacionada con el menú, como el mensaje de WM_INITMENUPOPUP que se envía cuando un elemento de menú necesita mostrar un submenú. Para obtener una explicación sobre cómo controlar estos mensajes, vea Menús.
Navegación mediante teclado
La aplicación debe procesar mensajes de teclado en el procedimiento de enlace de mensajes y actuar sobre los que afectan al seguimiento frecuente del menú. Se deben controlar las siguientes pulsaciones de tecla:
- Tecla ESCAPE. La tecla ESCAPE hace una copia de seguridad de la pantalla en un nivel. Si se muestra un submenú, debe contraerse. Si se muestra el menú principal de un botón, contraigalo y deshabilite el seguimiento frecuente del menú. El botón permanece activo.
- Tecla FLECHA DERECHA. Si el elemento tiene un submenú, mostrarlo. Si el elemento no tiene un submenú, contraiga el menú y los submenús, active el botón siguiente con TB_SETHOTITEM y muestre su menú. Si el último botón estaba activo cuando se recibió esta notificación, muestre el menú del primer botón.
- Tecla FLECHA IZQUIERDA. Si el elemento está en un submenú, contraigalo y cambie el foco al menú primario. Si el elemento no es un submenú, contraiga el menú, active el botón adyacente con TB_SETHOTITEM y muestre su menú. Si el primer botón estaba activo cuando se recibió esta notificación, muestre el menú del último botón.
- Teclas flecha arriba y flecha abajo. Estas teclas se usan para navegar dentro de un menú, pero no afectan directamente al seguimiento frecuente del menú.
- Tecla de aceleración alt-tecla . Use el TB_MAPACCELERATOR mensaje para determinar a qué botón corresponde el carácter clave . Si corresponde a un botón diferente al activo actualmente, contraiga el menú desplegable actual, active el nuevo botón con TB_SETHOTITEM y muestre el menú del botón adyacente. Si el carácter clave corresponde al botón que se muestra actualmente, contraiga el menú desplegable y deshabilite el seguimiento rápido del menú. El botón debe permanecer activo.