Acceso por teclado

Ya comentamos en el capítulo dedicado al ratón que ese dispositivo no es imprescindible en Windows, de modo que la comunicación entre la aplicación y el usuario se puede hacer exclusivamente desde el teclado, y los menús no son una excepción.

Mnemónicos

Una de las formas de agilizar el acceso por teclado son los mnemónicos, que se asignan añadiendo el símbolo & delante de la letra que activa el menú popup o el ítem de menú.

Aceceso de teclado estándar

Además existen teclas y combinaciones de teclas especialmente dedicadas al acceso a los menús:

  • Mnemónico: el carácter correspondiente selecciona el primer ítem con ese mnemónico. Si el ítem abre un menú, éste se muestra y se resalta su primer ítem. En caso contrario, se selecciona ese ítem. Para activar un menú mediante el mnemónico en necesario pulsar la tecla ALT.
  • ALT: enciende y apaga la barra de menú.
  • ALT+SPACEBAR: muestra el menú de ventana (o menú de sistema).
  • ENTER: activa un menú y selecciona su primer ítem de menú, si es que ese ítem abre un submenú. En caso contrario, se selecciona el ítem como si el usuario hubiese soltado el botón del ratón mientras el ítem estaba seleccionado.
  • ESC: sale del modo de menú.
  • Flecha izquieda: regresa al ítem de menú previo. Los ítems de mayor nivel incluyen los nombres y el menú de sistema. Si el ítem seleccionado está en una barra de menú, se selecciona la columna anterior de la columna o el menú de mayor nivel previo.
  • Flecha derecha: funciona como la tecla de flecha izquierda, pero en dirección contraria. En barras de menú, esta tecla mueve hacia la derecha una columna; cuando el ítem seleccionado actualmente es la última de la derecha abre, se selecciona el siguiente menú.
  • Flechas arriba y abajo: activa un menú cuando se presiona en un nombre de menú. Cuando se presiona en un menú, la flecha arriba selecciona el ítem previo y la flecha abajo el siguiente.

Aceleradores

Otro modo de acceder a opciones de menú mediante el teclado son los aceleradores, aunque en realidad estos son independientes de los menú, es costumbre añadir a los menús las combinaciones de teclas que activan la misma opción mediante un acelerador. De este modo, el usuario puede memorizar más fácilmente aquellas opciones de menú que usa más frecuentemente, y acceder a ellas mediante aceleradores en lugar de hacerlo mediante el menú.

Modificar menús

Siempre es posible modficar un menú durante la ejecución de la aplicación, tan sólo necesitamos su manipulador y aplicar las funciones que necesitemos entre las siguientes:

Función Descripción
AppendMenu Añade un nuevo ítem de menú al final del menú especificado. Esta función ha sido sustituida por InsertMenuItem. Sin embargo, se puede seguir usando, si no se necesitan las características extendidas de la función InsertMenuItem.
InsertMenu Inserta un nuevo ítem de menú dentro de un menú, moviendo los otros ítems hacia abajo. Esta función también ha sido sustituida por la función InsertMenuItem. De todos modos, se puede seguir usando, si no se necesitan las características extendidas de InsertMenuItem.
InsertMenuItem Inserta un nuevo ítem de menú en la posición especificada de un menú. Usa una estructura MENUITEMINFO para crear el ítem.
ModifyMenu Modifica un ítem de menú existente. Esta función ha sido sustituida por SetMenuItemInfo. De todos modos, se puede seguir usando si no se necesitan las características extendidas de SetMenuItemInfo.
SetMenuItemInfo Modifica la información sobre un ítem de menú. Usa una estructura MENUITEMINFO para modificar el ítem.
DeleteMenu Borra un ítem del menú especificado. Si el ítem de menú abre un menú o submenú, esta función destruye el manipulador del menú o submenú y libera la memoria usada por él.

Si se modifica un menú que actualmente se está visualizando, se debe llamar a la función DrawMenuBar para actualizar la ventana y reflejar los cambios.

El menú de sistema

El menú de sistema, también llamado menú de ventana o menú de control, es el que se muestra cuando se hace clic sobre el icono de la aplicación, o cuando se pulsa Alt+espacio.

Cuando se crea una aplicación, Windows asigna siempre el menú de sistema por defecto, siempre que se especifique el estilo WS_SYSMENU al crear la ventana.

A diferencia de los menús que hemos usado hasta ahora, el menú de sistema genera mensajes WM_SYSCOMMAND, en lugar de mensajes WM_COMMNAD, y generalmente, salvo que modifiquemos el menú de sistema, dejaremos que el proceso por defecto se encargue de esos mensajes, mediante la función DefWindowProc.

Modificar el menú de sistema

Modificar el menú de sistema es relativamente simple. Para empezar, obtendremos un manipulador de menú del menú de sistema mediante la función GetSystemMenu, usaremos como parámetros el manipulador de la ventana, y el valor FALSE, de modo que obtenemos una copia modificable del menú de sistema actual.

Una vez disponemos de un manipulador de menú para una copia del menú de sistema, podemos modificarlo usando las funciones que ya conocemos: AppendMenu, InsertMenu, InsertMenuItem, SetMenuItemInfo, ModifyMenu o DeleteMenu.

Los identificadores de los ítems que insertemos deben ser menores que 0xf000.

   static HMENU hmenuSistema;
...    
   switch(msg) {  /* manipulador del mensaje */
      case WM_CREATE:
        hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
        hmenuSistema = GetSystemMenu(hwnd, FALSE);
        InsertMenu(hmenuSistema, 0, MF_BYPOSITION | MF_STRING | MF_POPUP, 
           (UINT)GetSubMenu(GetMenu(hwnd), 1), "&Opciones");
        break;
...

Los ítems incluidos en un menú de sistema generan mensajes WM_SYSCOMMAND, por lo tanto, deberemos procesar este mensaje, teniendo cuidado de remitir a la función DefWindowProc aquellos que no procesemos nosotros.

      case WM_SYSCOMMAND:
        switch(LOWORD(wParam)) {
          case CM_OPCION1:
             break;
          case CM_OPCION2:
             break;
          case CM_OPCION3:
             break;
          case CM_OPCION4:
             break;
          default:
             return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        break;

Ejemplo 46


  Nombre Fichero Fecha Tamaño Contador Descarga
D Ejemplo 46 win046.zip 2004-07-23 3575 bytes 182