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

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

我有一个CTabView,其中一个选项卡为CRichEditView。将富文本添加到控件中并显示正常。如果我在CRichEditView中选择了文本,则工具栏的编辑项目会正常工作(例如,复制高亮显示,如果单击它,它将复制到剪贴板中)。但是,我发现如果选择文本并单击鼠标右键,则不会像CRichEditView一样显示带有CEditView的上下文菜单。在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_CONTEXT_EDIT_MENU在哪里:

IDR_CONTEXT_EDIT_MENU MENU
BEGIN
    POPUP "edit"
    BEGIN
        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
    END
END

现在,当我右键单击时,我会看到上下文菜单。但是,当我选择“复制”时,什么也没有发生。因此,我映射了ID_EDIT_COPY,以便可以设置断点以查看是否被调用。

void CMyRichView::OnEditCopy()
{
  // TODO: Add your command handler code here
    ASSERT_VALID(this);
    GetRichEditCtrl().Copy();
}

不是使用上下文项,而是使用工具栏。

我想念什么并且做错了什么?

TIA !!

mfc contextmenu cricheditctrl
1个回答
0
投票

如果消息转到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);
}
© www.soinside.com 2019 - 2024. All rights reserved.