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

标签 mfc clipboard

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

供引用,我基本上有:

class MyDialog : public CDialog
{
 CRichEditCtrl m_Edit;
};

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

最佳答案

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

关于mfc - 拦截粘贴到(丰富的)编辑控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2092776/

相关文章:

windows - 在 Windows 中,剪贴板到底是什么?

python - Python 中的剪贴板问题

linux - 如何在 Linux 下以 MS Office 格式从 IDE(以 HTML 格式)粘贴带有语法高亮的文本?

c++ - 问题调试 MFC 应用程序,构建但不运行

c - 在没有MFC的情况下使用MFC库

c++ - 在使用 C++ 的 win32 GUI 编程中,如何在 TreeViewCtrl 的根项之前添加扩展按钮?

python - Python 如何访问 X11 剪贴板?

c++ - GDI+ GraphicsContainer 不起作用

c++ - MFC CFormView OnKeyDown 事件未触发

windows - 剪贴板复制操作 - 内容是谁的文件?