CRichEditCtrl + EN_CHANGE
От: Vlads  
Дата: 23.10.17 12:05
Оценка:
Уже много раз здесь писалось по поводу перехвата EN_CHANGE, но мне перехватить корректно не удается.
У меня есть CRichEditView в нем я устанавливаю
SetEventMask(....|EN_MSGFILTER|EN_CHANGE)

В CRichEditView я перехватываю
ON_NOTIFY_REFLECT(EN_MSGFILTER, OnMsgFilter)

Но мой контрол richedit находится в диалоговом окне и я хочу в нем перехватывать сообщение EN_CHANGE. Смотрел MS Spy — никакие сообщения до диалога не доходят от контрола к диалогу.
Re: CRichEditCtrl + EN_CHANGE
От: Vlads  
Дата: 23.10.17 16:17
Оценка:
Уточняю, что контрол на основе document/view и находится на диалоговом окне. В View сообщения доходят, а к диалогу — нет.
Вижу, что в диалоге могу перехватывать через PreTranslateMessage некоторые сообщения, но не могу поймать EN_CHANGE или аналогчиное. А приходится вручную определять что идет набор текста и дальше как-то анализировать что данные в richedit изменились.
Как-то так ((
Re[2]: CRichEditCtrl + EN_CHANGE
От: CEMb  
Дата: 24.10.17 02:28
Оценка:
Здравствуйте, Vlads, Вы писали:

V>Уточняю, что контрол на основе document/view и находится на диалоговом окне. В View сообщения доходят, а к диалогу — нет.

V>Вижу, что в диалоге могу перехватывать через PreTranslateMessage некоторые сообщения, но не могу поймать EN_CHANGE или аналогчиное. А приходится вручную определять что идет набор текста и дальше как-то анализировать что данные в richedit изменились.
V>Как-то так ((

MFC так устроено, они перехватывают сообщения и потом мурыжат его в обработчиках, начиная с самого верхнего.
Данные в ричедите ещё можно проверять по нотификации EN_UPDATE, но это вроде когда поредактировали и ушли с контрола, если нужен посимвольный отлов, то только EN_CHANGE. А с PreTranslateMessage — мы так же делаем он идёт первым в стеке(даже раньше чем, WndProc), если сообщение там не разобрали, оно уходит в MFC-шный контейнер.
Re: CRichEditCtrl + EN_CHANGE
От: Carc Россия https://vk.com/gosha_mazov
Дата: 26.10.17 10:04
Оценка: +1
Здравствуйте, Vlads, Вы писали:

V>Уже много раз здесь писалось по поводу перехвата EN_CHANGE, но мне перехватить корректно не удается.

V>У меня есть CRichEditView в нем я устанавливаю
V>
V>SetEventMask(....|EN_MSGFILTER|EN_CHANGE)
V>

V>В CRichEditView я перехватываю
V>
V>ON_NOTIFY_REFLECT(EN_MSGFILTER, OnMsgFilter)
V>

V>Но мой контрол richedit находится в диалоговом окне и я хочу в нем перехватывать сообщение EN_CHANGE. Смотрел MS Spy — никакие сообщения до диалога не доходят от контрола к диалогу.
1) Не забываем ставить маску ENM_CHANGE

2) Как ловите EN_CHANGE? Насколько я помню, этот код нотификации приходит в WM_COMMAND, а вовсе не WM_NOTIFY. Т.е. в том же MFC ловится макросом ON_CONTROL_REFLECT(EN_CHANGE, OnChange), и соответственно функция будет вида
класс_где_ловим_вроде_того_же_диалога::OnChange()

По крайней мере это было верно для CRichEditView + наследник. Про диалог я точно не помню, стоит поиграться. Копать в сторону обработчика WM_COMMAND, там в HIWORD(WPARAM) будет лежать код нотификации.
Aml Pages Home
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.