2011-06-17 64 views
8

Tengo un menú con todo tipo de elementos de menú, como lo haría normalmente. Cada MenuItem (botón) tiene un título y me gustaría cambiar ese título en tiempo de ejecución. En un botón normal que no es realmente un problema, simplemente llamo al GetDlgItem(ID)->SetWindowText(CString);Cambiar el título de MenuItem en tiempo de ejecución

Sin embargo, no puedo hacer eso en los elementos del menú ya que no puedo asignar identificaciones a ninguno de ellos. El campo de Id. En el editor de Propiedades en realidad dice "ID no puede ser editado".

Entonces, ¿cómo puedo cambiar el texto de los elementos del menú en el tiempo de ejecución?

EDIT: He intentado utilizar el CMenu :: ModifyMenu sin embargo no he tenido éxito. No sé cómo especificar el botón (elemento) para cambiar. Además, tengo dudas sobre la forma en que paso el CString como argumento.

Este es mi (fallido) intento:

CString str = "Foo"; 
CMenu * pMenu = m_wndToolBar.GetMenu(); 
pMenu->ModifyMenu(1, MF_BYPOSITION | MF_STRING, 0 /*Don't know what to pass as nIDNewItem */, str); 

Esta (la llamada al método ModifyMenu) genera un error de depuración afirmación. Por favor no, no sé qué nIDNewItem.

Respuesta

0

Los menús no son ventanas, son menús. No puede usar GetDlgItem para acceder a un menú.

En MFC, la clase CMenu se puede usar para crear y/o controlar menús. CMenu::ModifyMenu podría ser lo que está buscando.

+0

Gracias por su respuesta. Me he tropezado con CMenu :: ModifyMenu antes, sin embargo, no logré cambiar el título. Por favor mira mi pregunta editada! ¡Gracias! –

4

Puede intentar agregar un controlador ON_UPDATE_COMMAND_UI para la opción de menú y llamando al pCmdUI->SetText().

0

¿Está seguro de que la llamada a GetMenu está devolviendo un CMenu válido? Intente llamar solo GetMenu() en lugar de m_wndToolBar.GetMenu().

Parece que su llamada al ModifyMenu, si pasa un MF_BYPOSITION no necesita el 3er parámetro. También tenga en cuenta que el primer parámetro (posición) comienza en 0.

5

Primero debe obtener el ID del comando del elemento del menú. Pruebe esto:

tr = L"Foo"; 
CMenu * pMenu = m_wndToolBar.GetMenu(); 
MENUITEMINFO info; 
info.cbSize = sizeof(MENUITEMINFO); 
info.fMask = MIIM_ID; 
VERIFY(pMenu->GetMenuItemInfo(1, &info, TRUE)); 
pMenu->ModifyMenuW(info.wID, MF_BYCOMMAND | MF_STRING, info.wID, tr); 
Cuestiones relacionadas