CMenu заменить пункт с подменю
У меня есть MFC CMenu с некоторыми предметами. Я хотел бы преобразовать или заменить один пункт меню с подменю, с дополнительными пунктами меню. Есть ли простой способ сделать это?
1 ответ
CMenu
класс обеспечивает член класса CMenu::SetMenuItemInfo
изменить существующий пункт меню, передав ему правильно инициализированный MENUITEMINFO
структура.
Чтобы заменить пункт меню всплывающим меню (подменю), необходимо выполнить 3 шага.
1. Создайте новое всплывающее меню
Вы можете создать меню динамически, вызвав CMenu::CreatePopupMenu
и заполнить его CMenu::InsertMenuItem
или загрузить существующее всплывающее меню из ресурса, используя CMenu::LoadMenu
:
CMenu MyMenu;
MyMenu.CreatePopupMenu();
MENUITEMINFO mii = { 0 };
mii.cbSize = sizeof( MENUITEMINFO );
mii.fMask = MIIM_ID | MIIM_STRING;
mii.wID = IDM_MY_MENU_ITEM1; // #define this in your Resource.h file
mii.dwTypeData = _T( "Menu Item 1" );
MyMenu.InsertMenuItem( 0, &mii, TRUE );
2. Инициализировать MENUITEMINFO
состав
MENUITEMINFO miiNew = { 0 };
miiNew.cbSize = sizeof( MENUITEMINFO );
miiNew.fMask = MIIM_SUBMENU | MIIM_STRING;
miiNew.hSubMenu = MyMenu.Detach(); // Detach() to keep the pop-up menu alive
// when MyMenu goes out of scope
miiNew.dwTypeData = _T( "Some text" );
3. Заменить существующий пункт меню
MyMainMenu.SetMenuItemInfo( IDM_ITEM_TO_BE_REPLACED,
&miiNew,
FALSE );
DrawMenuBar( hWnd );
Призыв к DrawMenuBar
требуется всякий раз, когда меню окна изменяется.