它具有可以调用的CRichEditCtrl::Copy()CRichEditCtrl::Paste()之类的方法,但是我无法发现Windows发送的告诉它执行粘贴操作的任何消息。有人知道这样的事情是否存在吗?还是CRichEditCtrl做较低级的操作,例如监视WM_CHAR事件?如果可以,我是否可以重用任何内部方法,还是只需要自己滚动即可覆盖标准粘贴功能?

我真正想要的是让我的自定义子类(CMyRichEditCtrl : CRichEditCtrl)忽略粘贴到控件中的文本的任何格式。通过以其他剪贴板格式获取剪贴板数据,或通过将其正常粘贴并立即删除插入文本的格式来进行。

我到目前为止所做的尝试:

  • 检查CMyRichEditCtrl::PreTranslateMessage()中的WM_PASTE消息
  • 创建方法virtual void CMyRichEditCtrl::Paste()
  • 在afxcmn.inl中的CRichEditCtrl::Paste()上放置一个断点
  • 转储通过CMyRichEditCtrl::PreTranslateMessage()传递的每条消息

  • 结果:

    1:未看到WM_PASTE消息
    2:从来没有
    3:从来没有打过……怎么样?
    4:该控件从不接收任何WM_COMMAND,WM_PASTE或与焦点有关的消息。基本上只有鼠标移动和按键消息

    似乎其他人实际上已经成功完成了此操作。我想知道此时我的MFC版本或其他版本是否可能搞砸了。

    最佳答案

    处理EN_PROTECTED消息。

    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
    }
    

    09-25 20:25