menu mfc cdialog popupmenubutton cmfcmenubutton

CMFCMenuButton no se cierra



cdialog popupmenubutton (1)

Tengo un CDialog con CFMCMenuButton . cuando lo abro, todo aparece normalmente:

El problema ocurre cuando hago clic en otro lugar para cerrar el menú. El menú parece imposible de cerrar, a menos que el usuario seleccione una opción de este. Y si presiono Escape en el teclado, el cuadro de diálogo se cierra, lo cual es demasiado drástico; Realmente quisiera que cerrara solo el menú.

Sé que podría resolver esto estableciendo su propiedad "Menú OS" en el archivo de recursos en Verdadero (o equivalente, asignando su propiedad m_bOSMenu= TRUE ). Y obtendría:

Como puedes ver en la imagen, las consecuencias son:

  • Pierdo los iconos (no muy importante)
  • OnInitMenuPopup algunas inhabilitaciones de elementos (importantes) hechas por OnInitMenuPopup (nota al margen: la segunda menucolumn también está hecha por OnInitMenuPopup y aparece como debería ser). Si el usuario hace clic en estas opciones, funcionarán y NO DEBERÍAN.

¿Cómo puedo resolver el problema?


La respuesta viene directamente de la fuente de MFC.

El archivo afxmenubutton.cpp en su función CMFCMenuButton::OnShowMenu aconseja utilizar un CDialogEx lugar de un CDialog :

#ifdef _DEBUG if ((pParent->IsKindOf(RUNTIME_CLASS(CDialog))) && (!pParent->IsKindOf(RUNTIME_CLASS(CDialogEx)))) { TRACE(_T("CMFCMenuButton parent is CDialog, should be CDialogEx for popup menu handling to work correctly./n")); } #endif

Luego cambié mi clase de diálogo para derivar de CDialogEx , ¡y ahora todo funciona perfectamente! Teniendo la propiedad del menú del sistema operativo como False, se muestran los iconos y las opciones deshabilitadas están realmente desactivadas y en gris.

ACTUALIZACIÓN : Parte de la documentación en https://msdn.microsoft.com/en-us/library/Bb983913.aspx