2010-01-19 49 views
2

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

仅供参考,我主要有:

class MyDialog : public CDialog 
{ 
CRichEditCtrl m_Edit; 
}; 

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

回答

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,这种方式...

+0

在EN_UPDATE ... I g但是我们在控件中做了格式化,我们只想确保用户不能输入格式。 – 2010-01-19 11:19:22

+0

关于“覆盖CRichEditCtrl”,你可以进一步了解更多细节吗?无论如何,这听起来是更好的选择。 – 2010-01-19 11:20:53

+0

真棒回答,感谢您花时间。 – 2010-01-19 13:30:16