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

时间:2011-09-23 16:45:05

标签: c++ winapi menu submenu

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

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

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。是否可以在应用程序启动时创建菜单(带子菜单)并在应用程序关闭时销毁它? Windows是否处理了菜单的破坏?

感谢回复。

1 个答案:

答案 0 :(得分:4)

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

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

你必须自己销毁HMENU(除非它附加到带有SetMenu()的HWND)