拦截粘贴到(丰富的)编辑控件
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”,你能说得更详细一点吗?无论如何,这听起来是更好的选择。以上是关于拦截粘贴到(丰富的)编辑控件的主要内容,如果未能解决你的问题,请参考以下文章