эффективные контекстные меню и подменю c ++ win32

Я хотел бы добавить контекстное меню / подменю правой кнопки мыши в мое приложение win32 (c ++), когда пользователь щелкает правой кнопкой мыши данные notifiyicon (значок в трее). Я могу сделать простое одноуровневое меню, но не могу найти примера многоуровневого меню.

Я хотел бы создать меню, которое выглядело бы примерно так:

Settings ->  Setting 1  -> Setting 2
                        -> Setting 3
         ->  Settings 4 -> Setting 5
                        -> Setting 6    
Exit 

Я создаю меню с помощью этого кода:

 HMENU hPopupMenu = CreatePopupMenu();
 InsertMenu(hPopupMenu, 0, MF_BYPOSITION | MF_STRING, IDM_EXIT, L"Exit");
 SetForegroundWindow(hWnd);
 TrackPopupMenu(hPopupMenu, TPM_BOTTOMALIGN | TPM_RIGHTALIGN, p.x, p.y, 0, hWnd, NULL);

Приведенный выше код помещается в обработчик сообщения notifyicondata (WM_RBUTTONUP).

Как я могу создавать подменю, используя приведенный выше код? Могу ли я создать новое HMENU и вставить его в родительское меню?

Еще меня беспокоит то, что меню всегда создается при запуске события щелчка правой кнопкой мыши, поэтому каждый раз, когда оно запускается, создается новое HMENU. Можно ли создать меню (с подменю) при запуске приложения и уничтожить его при закрытии приложения? Окна обрабатывают уничтожение меню?

Спасибо за ответ.


person blejzz    schedule 23.09.2011    source источник


Ответы (1)


Подменю - это просто еще одно HMENU (From CreatePopupMenu ()), вставленное как элемент меню с помощью AppendMenu / InsertMenu с использованием флага MF_POPUP или с помощью InsertMenuItem с MIIM_SUBMENU в маске.

Ничто не мешает вам создать меню при запуске приложения, но если в меню нет большого количества элементов или создание элементов не требует большого количества вычислений, я не вижу проблемы с их созданием в ответ на сообщение значка в трее.

Вы должны уничтожить HMENU самостоятельно (кроме случаев, когда он прикреплен к HWND с помощью SetMenu ())

person Anders    schedule 23.09.2011
comment
Также обратите внимание, что DestroyMenu уничтожает подменю, поэтому вам нужно только вызвать его для главного меню. - person pezcode; 23.09.2011
comment
у вас есть пример, как вставить меню 1 в главное меню? - person blejzz; 23.09.2011