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

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

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

class MyDialog : public CDialog
{
 CRichEditCtrl m_Edit;
};

И соответствующий DDX_Control(pDX, IDC_EDIT1, m_Edit), установленный в файле cpp. Поскольку я не думаю, что в CRichEditCtrl есть какие-либо встроенные средства для управления форматированием вставки, как я могу настроить это наиболее элегантно? Когда я работаю в Google, я вижу, что многие люди вручную захватывают CTRL + V и т. Д., Что не только ужасно, но и не работает на языках, где ключ вставки не V!

1 Ответ

3 голосов
/ 19 января 2010

Вы могли бы перехватить инструкцию 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 ...

...