首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRichEditCtrl如何知道已经执行了粘贴操作?

CRichEditCtrl如何知道已经执行了粘贴操作?
EN

Stack Overflow用户
提问于 2010-02-12 09:28:29
回答 6查看 4.1K关注 0票数 4

它有像CRichEditCtrl::Copy()CRichEditCtrl::Paste()这样的方法,您可以调用这些方法,但我找不到该控件由Windows发送的任何消息,这些消息告诉它执行粘贴操作。有人知道这种东西是否存在吗?还是CRichEditCtrl做了一些低级的事情,比如监视WM_CHAR事件?如果是这样的话,我可以重用任何内部方法,还是只需要自己的方法来覆盖标准的粘贴功能?

实际上,我希望我的自定义子类(CMyRichEditCtrl : CRichEditCtrl)忽略粘贴到控件的文本上的任何格式。要么以不同的剪贴板格式获取剪贴板数据,要么按常规粘贴剪贴板数据,然后立即删除插入文本的格式。

到目前为止我尝试过的:

  1. 在WM_PASTE中检查CMyRichEditCtrl::PreTranslateMessage()消息
  2. 创建方法virtual void CMyRichEditCtrl::Paste()
  3. CRichEditCtrl::Paste()上放置afxcmn.inl断点
  4. 通过CMyRichEditCtrl::PreTranslateMessage()转储消息

结果:

1:没有看到WM_PASTE消息

他说:从来没有叫过

它从未被击中..。怎么做?

4:从不接收任何WM_COMMAND、WM_PASTE或与焦点相关的消息.基本上只有鼠标移动和按键消息。

似乎其他人已经成功地做到了这一点。我想知道我的MFC版本是否会在这个时候搞砸它。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-15 15:21:28

处理EN_PROTECTED消息。

代码语言:javascript
复制
ON_NOTIFY_REFLECT(EN_PROTECTED, &YourClass::OnProtected)

// call this from the parent class
void YourClass::Initialize()
{
    CHARFORMAT format = { sizeof(CHARFORMAT) };
    format.dwEffects = CFE_PROTECTED; 
    format.dwMask = CFM_PROTECTED;

    SetDefaultCharFormat(format);
    SetEventMask(ENM_PROTECTED);
}

void YourClass::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
{
    *pResult = 0; 

    ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
    if (pEP->msg == WM_PASTE)
        pResult = 1; // prevent paste
}
票数 3
EN

Stack Overflow用户

发布于 2010-02-12 11:51:23

当用户请求粘贴操作时,通常是将带有标识符ID_EDIT_PASTE的ID_EDIT_PASTE消息发送到富编辑控件。默认情况下,在MFC中,这是由CRichEditCtrl::OnEditPaste()处理的,它调用编辑控件本身上的粘贴()。

我这样做的方法是从CRichEditCtrl派生一个类,添加一个OnEditPaste方法并使用

代码语言:javascript
复制
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)

宣言,这应该是可行的。或者,在您的PreTranslateMessage中,您可以使用wParam of ID_EDIT_PASTE查找WM_COMMAND。

顺便说一下,我解决了一个与您的问题非常相似的问题(粘贴没有格式化),只需使用OnEditPaste实现

代码语言:javascript
复制
void MyRichEdit::OnEditPaste()
{
  SendMessage(EM_PASTESPECIAL,CF_UNICODETEXT);
}

这将通过向坚持数据格式为纯文本的控件发送粘贴消息来响应粘贴请求。

最后,我应该指出,上述技术足以捕获从用户界面触发的所有粘贴。但是,当您的代码将WM_PASTE发送到编辑控件时,它不会捕获以编程方式触发的粘贴。在这种情况下,更改代码是最简单的。但是,如果您真的想拦截这种情况,就必须处理COM和IRichEditOleCallback::QueryAcceptData。但你几乎肯定不想去那里-)

票数 1
EN

Stack Overflow用户

发布于 2010-02-12 09:44:30

Windows为剪切/复制/粘贴定义消息。见

它可能是响应这些消息,而不是响应WM_CHAR消息来知道何时执行剪贴板操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2250759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档