c ++ win32 эффективные контекстные меню и подменю - PullRequest
4 голосов
/ 23 сентября 2011

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

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

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. Можно ли создать меню (с подменю) при запуске приложения и уничтожить его при закрытии приложения? Окна обрабатывают уничтожение меню?

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

1 Ответ

4 голосов
/ 23 сентября 2011

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

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

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

...