Cómo utilizar teclas de aceleración y un menú principal en el cuadro de diálogo en Visual C++

Seleccione idioma Seleccione idioma
Id. de artículo: 100770 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

Muchas aplicaciones utilizan un cuadro de diálogo modal como ventana de aplicación principal. Las aplicaciones que utilizan esta técnica también pueden incluir un menú principal en el cuadro de diálogo. Normalmente, uno o varios de los elementos de menú tienen un acelerador de teclado asociado con él. En este artículo describe los pasos necesarios para agregar un aceleradores de menú y del teclado a una aplicación basada en el cuadro de diálogo de Asistente para aplicaciones MFC.

Más información

Una aplicación típica que se desarrolló para el sistema operativo de Microsoft Windows mediante Visual C++ y el Kit de desarrollo de software (SDK) de Microsoft Windows y que utiliza los aceleradores de teclado llama a la función de TranslateAccelerator() en su bucle de mensajes principal. Sin embargo, cuando utiliza un cuadro de diálogo modal como ventana principal, la aplicación no tiene un bucle de mensajes principal; en su lugar, utiliza la aplicación el bucle de mensaje de administrador de cuadro de diálogo (integrado en Windows) para traducir y enviar mensajes. Por supuesto, debido a que este bucle de mensaje no es está diseñado para procesar los aceleradores, no llama la función TranslateAccelerator() .

Para procesar las teclas de aceleración en un cuadro de diálogo modal en MFC, debe reemplazar la función CWinApp::ProcessMessageFilter() . El marco de trabajo llama a ProcessMessageFilter() antes de que procesa un mensaje.

Para modificar un tipo de aplicación basada en cuadro de diálogo Asistente para aplicaciones MFC en Visual C++ .NET para procesar correctamente teclas de aceleración, siga estos pasos:
  1. En Visual Studio. NET, cree una nueva aplicación de MFC. En el panel izquierdo del Asistente para aplicaciones MFC, haga clic en Tipo de aplicación y, a continuación, asegúrese de que tipo de aplicación está establecido a diálogo basado .
  2. En la vista de recursos, haga doble clic en el recurso de diálogo para abrir el editor de recursos de diálogo. El identificador de recursos del recurso de cuadro de diálogo es similar a IDD_ MYPROJECT _DIALOG (donde MYPROJECT es el nombre que asignó el proyecto de aplicación cuando lo creó).
  3. Con el recurso de diálogo abierto en el editor de recursos de diálogo, busque la ventana Propiedades. Modifique el cuadro de diálogo propiedad Border y especifique el estilo de borde fino . Este paso es necesario para un cuadro de diálogo que contiene un menú.
  4. Crear un nuevo recurso de menú que contiene una entrada de nivel superior denominada & archivo y un elemento de menú denominado & Exit\tCTRL + E (CTRL + X está normalmente asociado con Cortar texto, por lo que CTRL+E se utiliza en su lugar).
  5. En el editor de menús, haga clic en el elemento de menú Exit recién creado. En la ventana Propiedades, asegúrese de que la propiedad ID para el elemento de menú Exit está establecida a ID_FILE_EXIT .
  6. Asociar el nuevo menú con el cuadro de diálogo escribiendo el identificador de menú en la propiedad de menú del recurso de diálogo. Abra el editor de diálogo para el recurso de cuadro de diálogo y busque la propiedad Menu en la ventana Propiedades. Establézcalo en el ID de recurso que creó para el menú en el paso 4. Para ello, haga clic en la lista desplegable en la fila de propiedad de menú y, a continuación, haga clic para seleccionar el identificador de recursos para el menú en la lista.
  7. En el editor de menús, haga clic con el botón secundario del mouse en & Exit\tCTRL + E y haga clic en Agregar controlador de eventos .
  8. En la sucesos Asistente para controladores, seleccione el tipo de mensaje de comando . En la lista clase , seleccione la clase principal de CDialog derivada para que se genera en el controlador. Asegúrese de que el nombre de controlador de función es adecuado y, a continuación, haga clic en Agregar y modificar para crear el controlador de eventos de elemento de menú.
  9. Inserte la línea siguiente en la función Salir menú elemento método controlador de eventos que se genera en el paso 8:
    PostMessage(WM_COMMAND, IDOK, 0L);
    					
    se produce el mismo efecto que hacer clic en Aceptar cuando el usuario hace clic en Salir en el menú archivo . Haga clic en Aceptar , se cierra la aplicación de cuadro de diálogo.

  10. Crear un nuevo recurso de acelerador y asociar el CTRL+E clave junto con ID_FILE_EXIT . Guardar los cambios.
  11. Edite el archivo StdAfx.h para declarar las variables globales siguientes después de las instrucciones # include :
    extern HWND    ghDlg;          // Handle to main dialog box.
    extern HACCEL  ghAccelTable;   // Handle to accelerator table.
    					
  12. En el archivo .cpp que contiene el CWinApp de implementación de la clase derivada (normalmente el archivo .cpp con el mismo nombre base que el nombre del proyecto), agregue las inicializaciones de variables globales siguientes:
    HWND    ghDlg = 0;          // Handle to main dialog box.
    HACCEL  ghAccelTable = 0;   // Handle to accelerator table.
    					
  13. En el principal CDialog derivada clase (no el diálogo clase que implementa el cuadro de diálogo predeterminado acerca ), busque el método OnInitDialog() . Si es necesario, puede agregar un reemplazo del método OnInitDialog() . Para ello, haga clic para seleccionar la clase derivada de CDialog en la ventana Vista de clases y a continuación, haga clic en Omitir en la ventana Propiedades. Busque la fila de OnInitDialog y haga clic en la columna derecha. Si no se reemplaza OnInitDialog() para esta clase, tiene la opción para crear un reemplazo.
  14. Modificar la función que agregó anteriormente para incluir la siguiente línea de código:
    ghDlg = m_hWnd;
    					
  15. En el archivo .cpp que contiene la implementación derivada de CWinApp , busque el método de clase InitInstance() . Agregue la siguiente línea inmediatamente después de la llamada a la clase base CWinApp::InitInstance() :
    ghAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_ACCELERATOR1));
    					
    Nota : el identificador de recurso que se utiliza aquí (IDR_ACCELERATOR1) es el identificador del recurso de tabla de aceleradores que se agrega en el paso 10.

  16. Agregue un reemplazo a la clase derivada de CWinApp para el método de clase ProcessMessageFilter() . Para ello, en la ventana Vista de clases, seleccione la clase derivada de CWinApp en el proyecto. A continuación, en la ventana Propiedades, haga clic en Omitir . Busque la fila ProcessMessageFilter en la ventana Propiedades y seleccione la columna del extremo derecho de esa fila. Haga clic en la flecha y, a continuación, haga clic en la opción para agregar un reemplazo del método ProcessMessageFilter .
  17. Edite el reemplazo del método ProcessMessageFilter() de modo que tiene la siguiente implementación:
    BOOL CMyProjectApp::ProcessMessageFilter(int code, LPMSG lpMsg)
           {
              if (code < 0)
                 CWinApp::ProcessMessageFilter(code, lpMsg);
    
              if (ghDlg && ghAccelTable)
                 {
                 if (::TranslateAccelerator(ghDlg, ghAccelTable, lpMsg))
                    return(TRUE);
                 }
    
             return CWinApp::ProcessMessageFilter(code, lpMsg);
          }
    					
  18. Compile y ejecute la aplicación. Tenga en cuenta que tiene un menú. Cuando haga clic en Salir en el menú archivo o presione CTRL+E, cierra la aplicación, como se esperaba.

Propiedades

Id. de artículo: 100770 - Última revisión: martes, 21 de noviembre de 2006 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual C# .NET 2002 Standard Edition
Palabras clave: 
kbmt kbacceleratorkey kbhowto kbkeyaccel kbmenu kbui KB100770 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 100770

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com