如何使CMenu TrackPopupMenu SubMenu菜单项可单击?

时间:2015-02-04 20:51:09

标签: windows mfc

通常当您将鼠标悬停在CMenu菜单项上的子菜单(带有小箭头)时,它会短暂延迟,然后显示子菜单项。此外,如果在延迟超时之前单击该项,则会显示子菜单项。我想要延迟行为,但我希望点击的行为不同。也就是说,我希望子菜单本身(带有箭头的子菜单)也是一个可点击的实体,即它有一个ID并导致WM_COMMAND和菜单被解雇。

该想法是,主子菜单菜单项是"默认",并且子菜单项是修改版本,例如, "打印碳粉>" (默认为默认打印机)和子菜单项,如"打印预览" "打印到文件"等等。感谢您的想法/建议。

修改

IDR_MY_MENU MENUEX
BEGIN
    POPUP "menu"
    BEGIN
        MENUITEM "&Something Else", ID_MENU_SOMETHING_ELSE
        POPUP "&Print", ID_MENU_PRINT
           BEGIN
           MENUITEM "Print Pre&view", ID_MENU_PRINT_PREVIEW
           MENUITEM "Print to &File", ID_MENU_PRINT_TO_FILE
           END
        MENUITEM "", -1, MFT_SEPARATOR
        MENUITEM "&Bottom", ID_MENU_BOTTOM
        MENUITEM "&Done", ID_MENU_DONE
    END
END

2 个答案:

答案 0 :(得分:0)

我不知道两年前我是否有更好的方式,但我解决问题的方法有一个限制:你拥有整个菜单。如果您拥有整个菜单,您可以创建两列(菜单/子菜单中的两列,而不是新的子菜单),并使用右列作为子菜单,将左列作为默认列。

答案 1 :(得分:0)

对于未来的StackOverflowers,这就是我所做的......

  1. OnInitMenuPopup添加了一个处理程序并对应 ON_WM_INITMENUPOPUP(),虽然这样做搞砸了我的UPDATE_COMMAND_UI处理程序,但我能够通过将该代码移动到OnInitMenuPopup处理程序来解决这个问题。
  2. OnInitMenuPopup处理程序中,为鼠标SetWindowsHookEx(WH_MOUSE,...)设置一个挂钩(检查是否尚未设置,因为子菜单可能会导致多次调用)...以及每个初始化的菜单在挂钩期间,将HMENU推送到链接列表。
  3. 在鼠标勾选过程中,检查列表末尾并向前工作,通过HMENU验证每个IsMenu是否仍然是活动菜单,如果不是,则将其删除。如果没有剩下的菜单,UnhookWindowsHook
  4. 如果挂钩过程中还有菜单,请检查WM_LBUTTONUPWM_RBUTTONUP,看看是否发生了一个菜单项(由于屏幕与子菜单的坐标映射,我无法我弄清楚我最终只是通过GetMenuItemRect循环浏览菜单项并检查PtInRect来确定这一点。
  5. 如果有点击次数,请对该项目执行GetMenuItemInfo,如果该项目有hSubMenu且该项目有wID(且wID没有不匹配子菜单句柄,只需将id发布为WM_COMMAND,发布WM_CANCELMODE即可关闭菜单,并禁用该挂钩... Bingo!
  6. 所以,似乎工作正常,其他一切功能都正常。此时唯一的问题是用于选择项目而不是打开子菜单的键盘处理程序,但我怀疑同样的想法也适用于那里。

    此外,我添加了主子菜单文本作为子菜单列表中的第一项,并带有一个分隔符,该分隔符为菜单的操作添加了一些清晰度。