MFC:如何在CTabView选项卡中实现CRichEditView的上下文菜单?

MFC:如何在CTabView选项卡中实现CRichEditView的上下文菜单?,mfc,contextmenu,cricheditctrl,Mfc,Contextmenu,Cricheditctrl,我有一个CTabView,其中一个选项卡是CRichEditView。富格文本被添加到控件并显示为精细。如果我在CRichEditView中选择文本,工具栏“编辑项目”工作正常(例如,复制高光,如果我单击它,它将复制到剪贴板)。但是,我发现,如果我选择文本并右键单击,则不会出现与CEditView类似的带有CRichEditView的上下文菜单。搜索Internet时,我找到了一个CRichEditView::GetContextMenu()的实现,可以尝试使用。它首先出现断言失败,因为CDoc

我有一个
CTabView
,其中一个选项卡是
CRichEditView
。富格文本被添加到控件并显示为精细。如果我在
CRichEditView
中选择文本,工具栏“编辑项目”工作正常(例如,复制高光,如果我单击它,它将复制到剪贴板)。但是,我发现,如果我选择文本并右键单击,则不会出现与
CEditView
类似的带有
CRichEditView
的上下文菜单。搜索Internet时,我找到了一个
CRichEditView::GetContextMenu()
的实现,可以尝试使用。它首先出现断言失败,因为
CDocument
不是富文本类型,所以为了测试,我删除了它(在下面注释掉),并最终得到以下结果:

HMENU CMyRichView::GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE* lpchrg)
{
  // TODO: Add your specialized code here and/or call the base class
  /*
  CRichEditCntrItem* pItem = GetSelectedItem();
    if (pItem == NULL || !pItem->IsInPlaceActive())*/
    {
      CMenu menuText;
      menuText.LoadMenu(IDR_CONTEXT_EDIT_MENU);
      CMenu* pMenuPopup = menuText.GetSubMenu(0);
      menuText.RemoveMenu(0, MF_BYPOSITION);
      return pMenuPopup->Detach();
    }
}
其中
IDR\u上下文\u编辑\u菜单是:

IDR_CONTEXT_EDIT_MENU MENU
BEGIN
    POPUP "edit"
    BEGIN
        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
    END
END
现在,当我右键单击时,我看到上下文菜单。然而,当我选择“复制”时,什么也没有发生。因此,我映射了
ID\u EDIT\u COPY
,以便设置断点以查看是否调用了它

void CMyRichView::OnEditCopy()
{
  // TODO: Add your command handler code here
    ASSERT_VALID(this);
    GetRichEditCtrl().Copy();
}
不是上下文项是否被使用,而是工具栏是否被使用

我错过了什么,做错了什么


蒂娅

如果消息转到
CTabView
,则添加
CTabView::OnEditCopy
处理程序

否则,您可以覆盖如下所示的
PreTranslateMessage
,这将确保消息发送到
CMyRichEditView::OnEditCopy

BOOL CMyRichEditView::PreTranslateMessage(MSG *msg)
{
    if(msg->message == WM_CONTEXTMENU || msg->message == WM_RBUTTONDOWN)
    {
        CMenu menu;
        menu.LoadMenu(IDR_CONTEXT_EDIT_MENU);
        int c = menu.GetMenuItemCount();
        CMenu* popup = menu.GetSubMenu(0);
        popup->TrackPopupMenu(0, msg->pt.x, msg->pt.y, this, NULL);
        return TRUE;
    }
    return CRichEditView::PreTranslateMessage(msg);
}

我通过spy看到命令被发送到
CTabView
窗口。我如何正确地路由它?但是,消息映射中的\u命令(ID\u EDIT\u COPY,&CMyTabView::OnEditCopy)
上的
没有被调用?这对我来说很有效,尽管我的
CRichEditView
设置与您的设置不同。工具栏和主菜单中是否有复制/粘贴按钮?它们有用吗?你能让“粘贴”命令工作吗?
CClipRichView
CMyRichView
是同一件事吗?我只有一个复制按钮,因为它在显示数据时被认为是只读的,但应该能够被复制。我认为这与信息地图不起作用有关。我有一个带有3个窗格的
CSplitterWnd
,其中一个是
CTabView
,其中一个选项卡是
CRichEditView
。我看到间谍把命令发送到CTabView窗口,但它哪儿也去不了?调试这个有什么窍门吗?一定少了什么东西。同样,工具栏
copy
项工作正常(消息映射将其发送到
CRichEditView
)。我做了一个
CMyTabView::OnEditCopy()
,它从未被调用:
ON_命令(ID\u EDIT\u copy,&CMyTabView::OnEditCopy)
。但是这个
PreTranslateMessage()
方法是有效的!!