Похоже, самое простое (с помощью 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...
?
* «Но как на самом деле заставить персонажа просто набирать?» * - Это неправильное предположение. 'EN_CHANGE' может быть поднят, когда пользователь не набрал символ (например, вставку из буфера обмена с помощью мыши). Непонятно, какую проблему вы действительно пытаетесь решить. Этот вопрос спрашивает только о вашем предлагаемом решении. – IInspectable
Вы правы - это был риторический вопрос, который я отредактировал. Надеюсь, теперь вопрос яснее. – omatai
Вы можете проследить в 'UpdateData', чтобы увидеть, что именно он делает, и почему он не работает. Но вызов «UpdateData» на каждом вводе символов - это злоупотребление системой - даже если вы его заработаете, я бы рекомендовал использовать «GetWindowText», как вы сейчас делаете. –