Compartir a través de


Ejemplo DYNAMENU: actualiza menús dinámicamente

Actualización: noviembre 2007

El ejemplo DYNAMENU ilustra la forma de modificar dinámicamente menús y barras de estado con independencia de si se conocen los comandos de control en tiempo de compilación. DYNAMENU ilustra las siguientes características:

  • Actualización dinámica de la lista de elementos de un menú.

  • Implementación del equivalente a los controladores ON_COMMAND y ON_UPDATE_COMMAND_UI para los comandos de menú cuyos identificadores no se conocen en tiempo de compilación. Esta ilustración puede aplicarse a casos más complejos, como los menús configurables por el usuario.

  • Actualización de los indicadores de comandos de la barra de estado para comandos cuyos identificadores no se conocen en tiempo de compilación.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo DYNAMENU

  1. Abra la solución dynamenu.sln.

  2. En el menú Generar, haga clic en Generar.

  3. En el menú Depurar, haga clic en Iniciar sin depurar.

DYNAMENU muestra inicialmente una ventana con el texto siguiente: "This text is displayed in the current color". Puede cambiar el color del texto mostrado seleccionando uno de los cuatro elementos ofrecidos inicialmente en el menú Color: Black, Red, Purple y Blue.

Para utilizar la característica de actualización dinámica de menús de DYNAMENU, haga clic en el comando Change Options del menú Color, que abre el cuadro de diálogo Change Color Options. Active las casillas Black, Red, Purple y Blue, que le permiten seleccionar los colores que se ofrecerán dinámicamente en el menú Color. Por ejemplo, si desactiva Red y Purple, y vuelve al menú Color, sólo se ofrecerán en el menú los elementos Black y Blue.

Observe que la barra de estado muestra, por ejemplo, "Set current color text to Black" cuando el foco esté en el elemento Black del menú Color.

Actualización dinámica de la lista de elementos de un menú

La clase CDynaMDIChildWnd de Mdichild.cpp implementa la actualización dinámica de elementos en el menú Color. Cuando se actualice la lista de colores disponibles o cuando se active la ventana MDI secundaria, la función CDynaMDIChildWnd::RefreshColorMenu llamará a CMenu::DeleteMenu para eliminar cada elemento de color del menú y después agregará al menú los colores disponibles actualmente mediante CMenu::AppendMenu.

Implementación de controladores de comandos para elementos de menú dinámicos

Se podría haber implementado DYNAMENU reservando una lista de identificadores de comandos fijos para los colores: ID_COLOR_BLACK, ID_COLOR_RED, etc. En este caso, se podría haber implementado los controladores ON_COMMAND y ON_UPDATE_COMMAND_UI para los comandos de color de la forma usual. Esto sería más sencillo que implementar DYNAMENU.

Sin embargo, en este ejemplo DYNAMENU no utiliza identificadores de comandos fijos. En lugar de ello, asigna dinámicamente identificadores de comandos que no se conocen o que están asociados a elementos de menú en tiempo de compilación. Esta ilustración puede aplicarse a casos más complejos, como los menús configurables por el usuario.

El equivalente del control de mapa de mensajes ON_COMMAND y ON_UPDATE_COMMAND se implementa en el código del documento que reemplaza a CCmdTarget::OnCmdMsg. Si se llama a la función OnCmdMsg con un puntero NULL para el parámetro AFX_CMDHANDLERINFO*, significa que no se ha encontrado ninguna entrada del mapa de mensajes para el comando. En este caso, el código que reemplaza a OnCmdMsg comprueba si el identificador de comando, pasado como primer parámetro, es uno de los identificadores de comando asignados dinámicamente para los elementos del menú de colores. Si es así, el código de reemplazo llama a un controlador de comandos (DoSelectColor) o a un controlador de interfaz de usuario de comandos (DoUpdateSelectColor), en función de si el segundo parámetro pasado a OnCmdMsg es el parámetro CN_COMMAND o CN_UPDATE_COMMAND_UI definido en MFC.

Actualización del indicador de la barra de estado para elementos de menú dinámicos

En DYNAMENU, la barra de estado pertenece a la ventana MDI secundaria (CDynaMDIChildWnd). La implementación predeterminada de CFrameWnd::GetMessageString utiliza el identificador de comando mostrado actualmente (para el elemento de menú que tiene actualmente el foco) para obtener el recurso de cadena correspondiente al comando y mostrarlo en el primer panel de la barra de estado. DYNAMENU reemplaza GetMessageString para mostrar un indicador de comando para los comandos definidos dinámicamente.

Palabras clave

En este ejemplo, se muestra el uso de las siguientes palabras clave:

AfxFormatString1; AfxGetMainWnd; CCmdTarget::OnCmdMsg; CDialog::DoModal; CDialog::OnInitDialog; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::UpdateAllViews; CFrameWnd::Create; CFrameWnd::GetActiveDocument; CFrameWnd::GetMessageString; CFrameWnd::LoadFrame; CMenu::AppendMenu; CMenu::DeleteMenu; CMenu::GetMenuItemCount; CMenu::GetMenuItemID; CMenu::GetSubMenu; CObject::AssertValid; CObject::Dump; CObject::Serialize; CString::LoadString; CView::DoPreparePrinting; CView::GetDocument; CView::OnBeginPrinting; CView::OnDraw; CView::OnEndPrinting; CView::OnPreparePrinting; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::CenterWindow; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetDlgItem; CWnd::GetMenu; CWnd::GetParentFrame; CWnd::OnCreate; CWnd::SetWindowText; CWnd::ShowWindow; CWnd::UpdateWindow; DragAcceptFiles; DrawText; LoadBitmap; RGB; SetBkMode; SetTextColor

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de MFC