Как добавить динамический пункт меню после вызова CMenu::LoadMenu?

В моем проекте есть меню, к которому нужно динамически добавлять элемент. В исходном коде пункты меню являются стационарными. Итак, меню определено в файле ресурсов:

IDM_SERVER_OPTIONS MENU DISCARDABLE
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Connect", IDC_LAUNCHITEM_CONNECT
        MENUITEM "&Delete",  IDC_REMOVE_SERVER
    END
END

и загружается в коде:

CMenu menu;
menu.LoadMenu(IDM_SERVER_OPTIONS);

Теперь существует новое требование, которое заключается в добавлении динамического пункта меню после загрузки меню ресурсов. Я сослался на эту статью: динамическое меню с использованием mfc. После этого я написал такой код:

CMenu menu;
menu.LoadMenu(IDM_SERVER_OPTIONS);
CMenu *autoConnectMenu = new CMenu;
autoConnectMenu->CreatePopupMenu();
autoConnectMenu->AppendMenu(MF_STRING | MF_ENABLED,
                            IDC_MENU_AUTO_CONNECT_SERVER, 
                            utils::LoadString(IDS_MENU_AUTO_CONNECT_SERVER));
menu.AppendMenu(MF_POPUP,
                (UINT)autoConnectMenu->m_hMenu,
                L"auto connect server");

К сожалению, это не работает. Новый пункт меню "сервер автоматического подключения" не может быть отображен. Затем я попробовал функцию HMENU:

CMenu menu;
menu.LoadMenu(IDM_SERVER_OPTIONS);
AppendMenu((HMENU)menu.GetSubMenu(0),
           MF_STRING | MF_ENABLED,
           IDC_AUTO_CONNECT_SERVER,
           utils::LoadString(IDS_MENU_AUTO_CONNECT_SERVER));

Работает нормально!

Я хочу знать, что проблема в моем прежнем коде? Цените!

1 ответ

Решение

Я думаю, что я нашел проблему. Я должен был позвонить

menu.GetSubMenu(0)->AppendMenu(...);

вместо

menu.AppendMenu(...);
Другие вопросы по тегам