我的CTabView
其中一个标签是a CRichEditView
。将富文本添加到控件中并显示正常。如果我CRichEditView
在工具栏中选择了文本,则编辑项目会正常工作(例如,复制高亮显示,如果单击它,它将复制到剪贴板中)。但是,我发现,如果我选择了文本并单击鼠标右键,将没有上下文菜单,该菜单与之前CRichEditView
一样CEditView
。搜索互联网,我找到了一个可供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!
如果消息转到,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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句