Вставка перехвата в (богатый) элемент управления редактирования
Я хочу переопределить поведение по умолчанию при вставке текста в элемент управления расширенного редактирования. В частности, я хочу вставить обычный текст, а не отформатированный форматированный текст. Я предполагаю, что это сводится к получению данных в другом формате буфера обмена, но я не знаю, как сначала перехватить поведение по умолчанию.
Для справки у меня в основном есть:
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...