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

Posted

技术标签:

【中文标题】拦截粘贴到(丰富的)编辑控件【英文标题】:Intercept pasting to a (rich) edit control 【发布时间】:2010-01-19 10:34:09 【问题描述】:

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

供参考,我基本上有:

class MyDialog : public CDialog

 CRichEditCtrl m_Edit;
;

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

【问题讨论】:

【参考方案1】:

您可以拦截 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 ...

【讨论】:

在 EN_UPDATE... 我猜,但我们确实在控件中格式,我们只想确保用户不能输入格式。 关于“覆盖 CRichEditCtrl”,你能说得更详细一点吗?无论如何,这听起来是更好的选择。

以上是关于拦截粘贴到(丰富的)编辑控件的主要内容,如果未能解决你的问题,请参考以下文章

不破坏复制/粘贴的子类编辑控件

求一文本编辑器控件

如何拦截粘贴到 NSTextView 以删除不支持的格式?

C++ MFC SDI 复制/粘贴不起作用

QT软件开发之基础控件--2.4.4 QTextEdit文本编辑器

在线文档编辑器的使用和数据字典(ueditor编辑器/my97datepicker日期控件)