Можно ли манипулировать меню CMFCMenuBar моего CMDIFrameWndEx?
В моем основном фрейме есть элемент CMFCMenuBar, который содержит меню текущего типа документа. Я хотел бы добавить / удалить подменю динамически. Например, если пользователь выбирает отображение панели карты, я хочу добавить подменю карты рядом с меню "Файл".
И наоборот, если панель карты закрывается, я также хочу удалить элементы меню карты.
Одна вещь, которая работает, но которая мне не нравится, это просто отключить пункты меню в ON_UPDATE_COMMAND_UI
обработчики.
Кадр имеет метод с именем GetMenuBar()
но тот возвращает мне const CMFCMenuBar *
поэтому я не могу изменить это снаружи. Я добавил геттер, чтобы получить неконстантную ссылку на строку меню, но это тоже не сработало:
CMenu menu;
VERIFY(menu.LoadMenu(IDR_MAP));
CMFCMenuBar & menuBar = pFrm->GetNonConstMenuBar(); // Custom getter
menuBar.InsertButton(CMFCToolBarMenuButton(0, menu, -1));
menuBar.AdjustLayout();
menuBar.AdjustSizeImmediate();
Приведенный выше код является адаптацией void CMyMenuBar::AddSubMenu ()
в DynamicMenu
образец. Однако у меня есть ощущение, что этот образец не работает, так как я не мог узнать, выполняется ли этот конкретный код или когда. В этом примере код выполняется только тогда, когда строка меню сбрасывается или когда состояние еще не сохранено в реестре.
Это просто невозможно или я что-то не так делаю?
Будет ли хорошая альтернатива добавлению / удалению подменю?
1 ответ
Один из способов сделать это - справиться с WM_INITMENUPOPUP
сообщение. Непосредственно перед отображением меню, OnInitMenuPopup
будет вызван с указателем на меню.
Обратите внимание, что это вызывается каждый раз, когда появляется меню, и любые изменения, которые вы делаете, теряются между вызовами (вы должны добавлять свои пункты меню каждый раз OnInitMenuPopup
называется).
Хитрость в использовании этого - выяснить, как определить меню, которое было вызвано. Одним из способов будет сравнение идентификатора пункта меню известного элемента. Например, если первый элемент в меню - ID_FILE_OPEN, вы можете найти это. Если он найден, вы предполагаете, что ваше меню "Файл" открывается, и вы можете добавить свое подменю.
Возможно, вы также можете использовать dwMenuData
член MENUINFO
struct, хотя мне кажется, что у меня проблемы с этим из-за того, как CMFCMenuBar
строит меню.