Я хотел бы иметь динамическое меню в моем приложении. Это динамическое меню должно содержать всплывающие меню, которые будут добавлены и удалены на лету. Для первого подхода я создал динамическое меню, созданное из отдельных пунктов меню.
AppendMenu(menu, MF_STRING, item_id, "TEST");
Я создал алгоритм, который генерирует item_id и сохраняет их в массиве, чтобы я мог удалить их с помощью
DeleteMenu(menu, id_to_be_deleted, MF_BYCOMMAND);
Я не вижу никаких подводных камней в этой реализации, и я доволен этим. Но потом застрял с окончательной реализацией. Я хотел бы, чтобы мои меню были всплывающими меню.
new_popup_menu = CreatePopupMenu();
AppendMenu(new_popup_menu, MF_STRING, 1, "TEST1");
AppendMenu(new_popup_menu, MF_STRING, 2, "TEST2");
AppendMenu(new_popup_menu, MF_STRING, 3, "TEST3");
AppendMenu(menu, MF_STRING|MF_POPUP,
(UINT_PTR)new_popup_menu, "dynamic menu");
Этот код работает, как и ожидалось, но я понятия не имею, как удалить "new_popup_menu" из "меню", так как параметр "UINT_PTR uIDNewItem" в AppendMenu теперьиспользуется в качестве дескриптора подменю, а не ID и не может использоваться с DeleteMenu + MF_BYCOMMAND. Есть ли способ удалить этот элемент подменю, кроме DeleteMenu + MF_BYPOSITION? Есть ли способ получить положение пункта меню по дескриптору, который возвращается CreatePopupMenu ())? Я чувствую реализацию алгоритма слежения за тем, какое меню в какой позиции вызывает боль в заднице. Поскольку в Windows есть API для вставки меню после другого определенного меню, воссоздание всего дерева меню является пустой тратой процессорного времени.