2017-02-08 2 views
0

Похоже, самое простое (с помощью Visual Studio):Почему UpdateData() не работает в обработчик EN_CHANGE для управления CEdit MFC

  • Место элемент управления редактирования (MFC CEdit) на диалоговом
  • права кнопкой мыши и выберите «Добавить переменную ...»
  • Ссылка управления переменной (например, CString SOMETEXT)
  • правой кнопкой мыши на элементе управления снова и выберите «Добавить обработчик событий ...»
  • нажмите кнопку «Добавить и Edit "butto п, так что добавляет обработчик EN_CHANGE событие с
  • Мастер класс генерирует функции обработчика как OnEnChangeEdtSomeText()

Потрясающе - каждый раз, когда персонаж набирается, функция обработчика вызывается. Однако во всех других случаях, с которыми я когда-либо обращался с элементами управления MFC, UpdateData() обменивал данные между элементом управления и связанной с ним переменной - состояние элемента управления отражается в состоянии связанной переменной после вызова UpdateData(). Почему не здесь? Ясно, что я должен использовать что-то еще, и до сих пор GetWindowText(), похоже, отлично работает для извлечения текста, который я вижу в элементе управления CEdit.

Но почему нормальная функция UpdateData() была уничтожена? Например, если я нахожу «foo» в своем элементе управления редактированием, затем щелкните или зайдите в закладку, чтобы убить фокус, затем вернитесь к типу «bar», ни одна из выписок OnEnChangeEdtSomeText() (все 6 из них) делает UpdateData() приводит к любым данным что бы ни произошло в переменной, связанной с ней. Почему нет? Могу ли я доверять EN_CHANGE, чтобы не мешать другим данным? Существуют ли другие уведомления, которые нарушат то, что я считал нормальной связью между элементом управления и переменной, связанной с помощью механизма DDX...?

+1

* «Но как на самом деле заставить персонажа просто набирать?» * - Это неправильное предположение. 'EN_CHANGE' может быть поднят, когда пользователь не набрал символ (например, вставку из буфера обмена с помощью мыши). Непонятно, какую проблему вы действительно пытаетесь решить. Этот вопрос спрашивает только о вашем предлагаемом решении. – IInspectable

+0

Вы правы - это был риторический вопрос, который я отредактировал. Надеюсь, теперь вопрос яснее. – omatai

+3

Вы можете проследить в 'UpdateData', чтобы увидеть, что именно он делает, и почему он не работает. Но вызов «UpdateData» на каждом вводе символов - это злоупотребление системой - даже если вы его заработаете, я бы рекомендовал использовать «GetWindowText», как вы сейчас делаете. –

ответ

0

Если это расширенное редактирование, вам необходимо позвонить SetEventMask(ENM_CHANGE), или сообщение не будет отправлено на издание.