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

问题描述 投票:0回答:2

我在使用人民币上下文菜单时遇到问题,在我的主框架中,我有一个带有人民币上下文菜单事件的网格控件。快捷键显示正确。请参阅 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);
    }
}

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

我知道这些信息很模糊,但我只能提供这些。 预先感谢!

c++ visual-c++ mfc
2个回答
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);
}

注意,第 5 个参数对于

TRUE
应该是
CDialogEx
,对于
FALSE
 应该是 
CDialog


0
投票

确保您的 MyDialog 类型为 CDialogEx 或 CMFCPropertyPage。

在 CMFCPopupMenu::Create 函数中,将调用 CMFCPopupMenu::NotifyParentDlg 函数。

BOOL CMFCPopupMenu::NotifyParentDlg(BOOL bActivate)
{
    CDialogEx* pDlg = DYNAMIC_DOWNCAST(CDialogEx, m_pMessageWnd);
    CMFCPropertyPage* pPropPage = DYNAMIC_DOWNCAST(CMFCPropertyPage, m_pMessageWnd);

    if (pDlg == NULL && pPropPage == NULL)
    {
        return FALSE;
    }

    if (!bActivate && m_pActivePopupMenu != this)
    {
        return FALSE;
    }

    if (pDlg != NULL)
    {
        pDlg->SetActiveMenu(bActivate ? this : NULL);
    }

    if (pPropPage != NULL)
    {
        pPropPage->SetActiveMenu(bActivate ? this : NULL);
    }

    return TRUE;
}

弹出菜单的删除取决于父窗口或消息窗口是否设置了活动菜单。

© www.soinside.com 2019 - 2024. All rights reserved.