它具有可以调用的CRichEditCtrl::Copy()
,CRichEditCtrl::Paste()
之类的方法,但是我无法发现Windows发送的告诉它执行粘贴操作的任何消息。有人知道这样的事情是否存在吗?还是CRichEditCtrl
做较低级的操作,例如监视WM_CHAR事件?如果可以,我是否可以重用任何内部方法,还是只需要自己滚动即可覆盖标准粘贴功能?
我真正想要的是让我的自定义子类(CMyRichEditCtrl : CRichEditCtrl
)忽略粘贴到控件中的文本的任何格式。通过以其他剪贴板格式获取剪贴板数据,或通过将其正常粘贴并立即删除插入文本的格式来进行。
我到目前为止所做的尝试:
CMyRichEditCtrl::PreTranslateMessage()
中的WM_PASTE消息virtual void CMyRichEditCtrl::Paste()
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
}