我希望在将文本粘贴到富编辑控件时覆盖默认行为。具体来说,我想粘贴纯文本,而不是格式化的富文本。我想这归结为将数据作为不同的剪贴板格式,但我不知道如何首先拦截默认行为。
作为参考,我基本上有:
class MyDialog : public CDialog
{
CRichEditCtrl m_Edit;
};
并在cpp文件中设置相关的DDX_Control(pDX, IDC_EDIT1, m_Edit)
。由于我不认为CRichEditCtrl有任何内置的工具来控制粘贴格式,我怎样才能最优雅地设置它?当我谷歌时,我发现有很多人手动捕获CTRL + V等...这不仅很糟糕,而且在粘贴键不是V的语言中不起作用!
答案 0 :(得分:3)
您可以拦截EN_UPDATE指令并在收到时重新格式化文本?唯一的问题是您不知道添加了哪些新数据。
但是,您可能会发现使用您自己的方法覆盖CRichEditCtrl更容易,并拦截您想要对传入数据进行处理的消息,然后调用父类的该函数的实现。这样每次添加某些内容时,您都会执行必要的重新格式化...
编辑:从CRichEditCtrl派生类非常容易
class CMyRichEditCtrl : public CRicheditCtrl
{
DECLARE_DYNAMIC( CMyRichEditCtrl )
protected:
DECLARE_MESSAGE_MAP()
public:
CMyRichEditCtrl();
virtual ~CMyRichEditCtrl();
// ... Rest of implementation here
};
然后您可以按照以下方式拦截消息映射中的消息...
ON_MESSAGE( EM_PASTESPECIAL, &CMyRichEditCtrl::OnPasteSpecial )
并且您的处理程序将如下所示:
LRESULT CMyRichEditCtrl::OnPasteSpecial( WPARAM wParam, LPARAM lParam )
wParam是剪贴板格式,lParam包含NULL或REPASTESPECIAL结构。
您需要做的就是确保您的类是接收所有消息的类,并且可以使用DoDataExchange函数轻松完成。
将您的成员变量定义为:
CMyRichEditCtrl m_MyRichEditCtrl;
并将以下内容添加到DoDataExchange:
DDX_Control( pDX, IDC_MYRICHEDIT, m_MyRichEditCtrl );
现在所有消息都将通过RichEditCtrl
的实现路由您可以通过这种方式截取任何消息,包括WM_PASTE ......