通常当您将鼠标悬停在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
答案 0 :(得分:0)
我不知道两年前我是否有更好的方式,但我解决问题的方法有一个限制:你拥有整个菜单。如果您拥有整个菜单,您可以创建两列(菜单/子菜单中的两列,而不是新的子菜单),并使用右列作为子菜单,将左列作为默认列。
答案 1 :(得分:0)
对于未来的StackOverflowers,这就是我所做的......
OnInitMenuPopup
添加了一个处理程序并对应
ON_WM_INITMENUPOPUP()
,虽然这样做搞砸了我的UPDATE_COMMAND_UI
处理程序,但我能够通过将该代码移动到OnInitMenuPopup
处理程序来解决这个问题。OnInitMenuPopup
处理程序中,为鼠标SetWindowsHookEx(WH_MOUSE,...)
设置一个挂钩(检查是否尚未设置,因为子菜单可能会导致多次调用)...以及每个初始化的菜单在挂钩期间,将HMENU
推送到链接列表。HMENU
验证每个IsMenu
是否仍然是活动菜单,如果不是,则将其删除。如果没有剩下的菜单,UnhookWindowsHook
。WM_LBUTTONUP
或WM_RBUTTONUP
,看看是否发生了一个菜单项(由于屏幕与子菜单的坐标映射,我无法我弄清楚我最终只是通过GetMenuItemRect
循环浏览菜单项并检查PtInRect
来确定这一点。GetMenuItemInfo
,如果该项目有hSubMenu
且该项目有wID
(且wID
没有不匹配子菜单句柄,只需将id发布为WM_COMMAND
,发布WM_CANCELMODE
即可关闭菜单,并禁用该挂钩... Bingo!所以,似乎工作正常,其他一切功能都正常。此时唯一的问题是用于选择项目而不是打开子菜单的键盘处理程序,但我怀疑同样的想法也适用于那里。
此外,我添加了主子菜单文本作为子菜单列表中的第一项,并带有一个分隔符,该分隔符为菜单的操作添加了一些清晰度。