拦截粘贴到(丰富的)编辑控件

时间:2010-01-19 10:34:10

标签: mfc clipboard

我希望在将文本粘贴到富编辑控件时覆盖默认行为。具体来说,我想粘贴纯文本,而不是格式化的富文本。我想这归结为将数据作为不同的剪贴板格式,但我不知道如何首先拦截默认行为。

作为参考,我基本上有:

class MyDialog : public CDialog
{
 CRichEditCtrl m_Edit;
};

并在cpp文件中设置相关的DDX_Control(pDX, IDC_EDIT1, m_Edit)。由于我不认为CRichEditCtrl有任何内置的工具来控制粘贴格式,我怎样才能最优雅地设置它?当我谷歌时,我发现有很多人手动捕获CTRL + V等...这不仅很糟糕,而且在粘贴键不是V的语言中不起作用!

1 个答案:

答案 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 ......