C++ win32高效上下文菜单和子菜单

ble*_*jzz 5 c++ winapi menu submenu

当用户右键单击 notifyicon 数据(托盘图标)时,我想向我的 win32 应用程序(c++)添加右键单击上下文菜单/子菜单。我可以制作一个简单的一级菜单,但找不到多级菜单的示例。

我想创建一个看起来像这样的菜单:

Settings ->  Setting 1  -> Setting 2
                        -> Setting 3
         ->  Settings 4 -> Setting 5
                        -> Setting 6    
Exit 
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码创建菜单:

 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);
Run Code Online (Sandbox Code Playgroud)

上面的代码放置在notifyicondata消息处理程序(WM_RBUTTONUP)内。

如何使用上面的代码创建子菜单?我是否创建一个新的 HMENU 并将其插入到父菜单中?

另一件让我困扰的事情是,菜单总是在触发右键单击事件时创建,因此每次触发时都会创建一个新的 HMENU。是否可以在应用程序启动时创建菜单(带有子菜单)并在应用程序关闭时销毁它?Windows 是否处理菜单的销毁?

感谢您的回复。

And*_*ers 4

子菜单只是另一个 HMENU(来自 CreatePopupMenu()),通过使用 MF_POPUP 标志的 AppendMenu/InsertMenu 或掩码中带有 MIIM_SUBMENU 的 InsertMenuItem 作为菜单项插入。

当应用程序启动时,没有什么可以阻止您创建菜单,但除非菜单有大量项目或创建项目需要大量计算,否则我不认为创建它们以响应托盘图标消息有问题。

您必须自己销毁 HMENU(除非它通过SetMenu()附加到 HWND )

  • 另请注意,DestroyMenu 会销毁子菜单,因此您只需为主菜单调用它即可。 (3认同)