Вставка перехвата в (богатый) элемент управления редактирования

Я хочу переопределить поведение по умолчанию при вставке текста в элемент управления расширенного редактирования. В частности, я хочу вставить обычный текст, а не отформатированный форматированный текст. Я предполагаю, что это сводится к получению данных в другом формате буфера обмена, но я не знаю, как сначала перехватить поведение по умолчанию.

Для справки у меня в основном есть:

class MyDialog : public CDialog
{
 CRichEditCtrl m_Edit;
};

И соответствующие DDX_Control(pDX, IDC_EDIT1, m_Edit) установить в файле cpp. Поскольку я не думаю, что в CRichEditCtrl есть какие-либо встроенные средства для управления форматированием вставки, как я могу настроить это наиболее элегантно? Когда я работаю в Google, я вижу, что многие люди вручную захватывают 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...

Другие вопросы по тегам