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 требуется всякий раз, когда меню окна изменяется.

Другие вопросы по тегам