【问题标题】: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 的语言中不起作用!

【问题讨论】:

    标签: mfc clipboard


    【解决方案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”,你能说得更详细一点吗?无论如何,这听起来是更好的选择。
    猜你喜欢
    • 2010-09-10
    • 2011-08-29
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多