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 - 右键单击上下文菜单快捷键由于某种原因消失的主要内容,如果未能解决你的问题,请参考以下文章