【问题标题】:c++ win32 efficient context menus and submenusc++ win32高效上下文菜单和子菜单
【发布时间】:2011-11-23 20:10:26
【问题描述】:

当用户右键单击通知图标数据(托盘图标)时,我想在我的 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会处理菜单的销毁吗?

感谢您的回复。

【问题讨论】:

    标签: c++ winapi menu submenu


    【解决方案1】:

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

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

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

    【讨论】:

    • 另请注意,DestroyMenu 会破坏子菜单,因此您只需为主菜单调用它。
    • 您有一个如何将菜单 1 插入主菜单的示例吗?
    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2011-11-09
    • 2013-12-27
    • 2019-08-02
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多