CMFCPopupMenu - 右键单击​​上下文菜单快捷键由于某种原因消失

Posted

技术标签:

【中文标题】CMFCPopupMenu - 右键单击​​上下文菜单快捷键由于某种原因消失【英文标题】:CMFCPopupMenu - RightClick Context menu shortcut keys disappear for some reason 【发布时间】:2018-02-13 08:23:50 【问题描述】:

我在使用 RMB 上下文菜单时遇到问题,在我的主框架中,我有一个带有 RMB 上下文菜单事件的网格控件。快捷键显示正确。请参阅 Ctrl + C 的复制,Ctrl + V 的粘贴等...

然后我有一个对话框,其中已经包含来自其他开发人员的一堆代码。这个对话框不知何故使人民币上下文菜单变得时髦。快捷键不再出现。这可能是由于更改了 PreTransalateMessage 并且某些消息未正确通过或某些可能有冲突的 shell 函数引起的。因为当您注意到窗口时,它仍在使用 windows aero 基本主题,而我正在使用 Windows 10,因为最小化旁边的图钉图标。

这是主机和对话框中使用的代码。

void MyDialog::OnContextMenu(CWnd* pWnd, CPoint ptMousePos)

    CMenu *menuRightClick;
    menuRightClick->LoadMenu(IDR_RIGHTCLICK);
    CMenu *pPopupVitmMenu;
    pPopupVitmMenu = menuRightClick->GetSubMenu(9);
    ASSERT(pPopupVitmMenu);

    if (pPopupVitmMenu)
    
        CPoint point;
        ::GetCursorPos(&point);

        CMFCPopupMenu* pPopupMenu = new CMFCPopupMenu;

        CMFCPopupMenu* pPopup = CMFCPopupMenu::GetActiveMenu();
        //close already poped up menus, if any.
        if (pPopup != NULL)
            pPopup->CloseMenu();

        pPopupMenu->Create(this, point.x, point.y, pPopupVitmMenu->Detach(), FALSE, TRUE);

        pPopupMenu->ShowWindow(SW_SHOW);
    

这可能相关或不相关,但是当您在另一个区域使用人民币时,旧的上下文菜单不会被关闭。只有当您在应用程序外部(桌面、任务栏)单击时它才会消失。

我知道信息很模糊,但我只能提供这些。 提前致谢!

【问题讨论】:

最好使用CContextMenuManager::ShowPopupMenu 来显示上下文菜单。 msdn.microsoft.com/en-us/library/… 不走运,我用了 CWinAppEx::GetContextMenuManager 然后用它的成员函数 ShowPopupMenu 问题依旧。 您是否已经清理了注册表中的注册表缓存?应用程序的 Workspace 子文件夹。 查看CKeyboardManager::UpdateAccelTable最后一个参数,我们知道加速表只适用于CFrameWnd*派生对象。我有一个应用程序有几个CFrameWnd* 派生对象的案例,我必须通过在每个pSecFrame 初始化中手动调用theApp.GetKeyboardManager()->UpdateAccelTable(NULL, pMainFrame->m_hAccelTable, (CFrameWnd*) pSecFrame) 来使我的真实主窗口的加速器表与其他人共享。 (待续……) (...continuation) 我还必须防止在辅助框架被破坏时破坏现在共享的加速器表,在它对 ON_WM_DESTROY() 的响应中,由方法 CSecondaryFrame::OnDestroy 定义,使用` m_hAccelTable = NULL;__super::OnDestroy();` 那么__super类的构造函数会被伪造,不会看到真正的表,也不会销毁它。 【参考方案1】:

使用theApp.GetContextMenuManager() 访问CContextMenuManager。其中theApp 是主要的CWinApp 类。它应该在初始化期间调用InitContextMenuManager()

CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
CMenu *popup = menu.GetSubMenu(0);
if(popup)

    CContextMenuManager *manager = theApp.GetContextMenuManager();
    if(manager)
        //for CDialogEx:
        manager->ShowPopupMenu(popup->Detach(), p.x, p.y, this, TRUE, TRUE, FALSE);
        //for CDialog:
        //manager->ShowPopupMenu(popup->Detach(), p.x, p.y, this, FALSE, TRUE, FALSE);

请注意,对于CDialogEx,第 5 个参数应为 TRUE,对于 CDialog,应为 FALSE

【讨论】:

CContextMenuManager *manager = GetApp()->GetContextMenuManager(); manager->ShowPopupMenu(pPopupVitmMenu->GetSafeHmenu(), point.x, point.y, this, 0, 1, 0);

以上是关于CMFCPopupMenu - 右键单击​​上下文菜单快捷键由于某种原因消失的主要内容,如果未能解决你的问题,请参考以下文章

右键单击 datagridview 的上下文菜单

VBA:如何从右键单击上下文菜单中禁用某些选项

选择两个文件时,从右键单击 Windows 上下文菜单中隐藏一个选项

在窗口范围内限制/移动上下文菜单(右键单击)

如何在 Java Swing 中创建右键单击上下文菜单?

右键单击之前不应用上下文菜单样式