2010-01-19 1 views
2

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

Для справки, я в основном имею:

class MyDialog : public CDialog 
{ 
CRichEditCtrl m_Edit; 
}; 

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

ответ

3

Вы можете перехватить инструкцию EN_UPDATE и переформатировать текст при его получении? Только проблема заключается в том, что вы не знаете, какие новые данные были добавлены.

Возможно, вам будет проще переопределить CRichEditCtrl своим собственным и перехватить любые сообщения, которые вы хотите обработать по входящим данным, а затем вызвать реализацию этой функции родительским классом. Таким образом, каждый раз, когда что-то добавляется вы выполняете необходимые переформатирует ...

Edit: Для того, чтобы вывести класс из 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, таким образом ...

+0

По EN_UPDATE ... I g uess, но мы форматируем _have_ в элементе управления, мы хотим, чтобы пользователь не мог вводить форматирование. –

+0

На «переопределении CRichEditCtrl», можете ли вы пойти немного подробнее? Это звучит лучше, пока что так или иначе. –

+0

Удивительный ответ, спасибо, что нашли время. –