Уже много раз здесь писалось по поводу перехвата EN_CHANGE, но мне перехватить корректно не удается.
У меня есть CRichEditView в нем я устанавливаю
SetEventMask(....|EN_MSGFILTER|EN_CHANGE)
В CRichEditView я перехватываю
ON_NOTIFY_REFLECT(EN_MSGFILTER, OnMsgFilter)
Но мой контрол richedit находится в диалоговом окне и я хочу в нем перехватывать сообщение EN_CHANGE. Смотрел MS Spy — никакие сообщения до диалога не доходят от контрола к диалогу.
Уточняю, что контрол на основе document/view и находится на диалоговом окне. В View сообщения доходят, а к диалогу — нет.
Вижу, что в диалоге могу перехватывать через PreTranslateMessage некоторые сообщения, но не могу поймать EN_CHANGE или аналогчиное. А приходится вручную определять что идет набор текста и дальше как-то анализировать что данные в richedit изменились.
Как-то так ((
Здравствуйте, Vlads, Вы писали:
V>Уточняю, что контрол на основе document/view и находится на диалоговом окне. В View сообщения доходят, а к диалогу — нет.
V>Вижу, что в диалоге могу перехватывать через PreTranslateMessage некоторые сообщения, но не могу поймать EN_CHANGE или аналогчиное. А приходится вручную определять что идет набор текста и дальше как-то анализировать что данные в richedit изменились.
V>Как-то так ((
MFC так устроено, они перехватывают сообщения и потом мурыжат его в обработчиках, начиная с самого верхнего.
Данные в ричедите ещё можно проверять по нотификации EN_UPDATE, но это вроде когда поредактировали и ушли с контрола, если нужен посимвольный отлов, то только EN_CHANGE. А с PreTranslateMessage — мы так же делаем
он идёт первым в стеке(даже раньше чем, WndProc), если сообщение там не разобрали, оно уходит в MFC-шный контейнер.
Здравствуйте, 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) будет лежать код нотификации.