2016-01-06 2 views
0

Я вижу очень странное поведение CEdit. В моем производном классе из элемента управления CEdit мне нужно поймать событие изменения текста. Я делаю это с помощью ON_CONTROL_REFLECT_EXMFC: не получил сообщение EN_CHANGE в производном CEdit

class CSomeDerivedEdit : public CEdit 
{ 
    DECLARE_DYNAMIC(CSomeDerivedEdit) 
public: 
    CSearchEditCtrl(); 

protected: 
    DECLARE_MESSAGE_MAP() 
    afx_msg BOOL OnEnChange(); 
... 
}; 

в CPP

IMPLEMENT_DYNAMIC(CSomeDerivedEdit , CEdit) 

BEGIN_MESSAGE_MAP(CSomeDerivedEdit , CEdit) 
    ON_CONTROL_REFLECT_EX(EN_CHANGE, &CSomeDerivedEdit::OnEnChange) 
END_MESSAGE_MAP() 

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

m_someEdit.Create(WS_CHILDWINDOW|WS_VISIBLE, rcRect, this, IDC_EDIT); здесь все в порядке

m_someEdit.Create(WS_CHILDWINDOW|WS_VISIBLE, rcRect, GetHeaderCtrl(), IDC_EDIT); здесь также контролировать создание хорошо и я вижу его, но on_control_reflect не вызывается, когда я набираю в окне редактирования.

+0

Итак, я снова нашел очень странное решение. Я получаю свой собственный класс CHeaderCtrl и просто подклассифицирую его в список управления, после чего я начинаю входить в его дочерний элемент управления EN_CHANGE. Но почему это так, я до сих пор не понимаю :) –

ответ

3

ON_CONTROL_REFLECT_EX может работать только в том случае, если получатель сообщения WM_COMMAND также подклассифицирован в MFC. Если это чистый контроль над окнами, а не подклассом с MFC, сообщение WM_COMMAND никогда не отображается ни одному ребенку.

Помните: отражение работает, потому что MFC сначала обрабатывает сообщение WM_COMMAND от дочернего элемента родителя и возвращает его обратно дочернему элементу управления. И если не обрабатывается сообщение WM_COMMAND обрабатывается внутри родителя. Стандартные элементы управления окном не знают отражения и всегда обрабатывают сообщения WM_COMMAND сами по себе ....

Так что если управление заголовком не подклассифицировано MFC, отражение не будет работать.

+0

Так это правильное решение для подкласса фиктивного управления заголовком или есть другой способ получить событие изменения текста в классе редактирования? –

+0

Мой вопрос: почему вы используете заголовок как родительский. Редактирование – xMRi

+0

будет открыто при управлении заголовком, это похоже на быстрый поиск в элементе управления списком, когда пользователь начнет вводить текст редактирования, будет открыт в заголовке с помощью строки поиска. Если вы создадите дочерний элемент заголовка, это предотвратит любые проблемы с Z-ордером или проблемы с братьями, редактирование будет просто дочерним окном заголовка, у которого есть стиль для детей. –

Смежные вопросы