Есть ли способ узнать, какое второе событие произойдет в MFC? - PullRequest
1 голос
/ 04 июня 2010

Я наткнулся на любопытную проблему с MFC. У меня есть диалог, в котором я проверяю каждое поле редактирования в ON_EN_KILLFOCUS, если оно действительно. Если проверка не проходит, я возвращаю фокус и показываю сообщение об ошибке. Это было бы хорошо, если бы я только закрыл диалог. Я имею в виду, если я покину неправильно введенное поле и нажму кнопку закрытия или X, то ON_EN_KILLFOCUS вызывается первым, после других событий обработки, потому что появляется сообщение и фокус возвращается к полю. Итак, мой вопрос: есть ли способ узнать в ON_EN_KILLFOCUS, какое событие будет после него? Если да, тогда я могу проверить, если это событие закрытия, а затем закрыть диалог, не возвращая мой фокус неправильно введенному полю редактирования. Любая помощь будет такой большой помощью!

1 Ответ

2 голосов
/ 04 июня 2010

Как правило, вы не можете знать, какое событие наступает после события, изменившего фокус.

Однако это можно решить, вы меняете условия при срабатывании логики проверки - проверяете элемент управления редактирования, когда

  • фокус потерян
  • и фокус теряется на другой элемент управления

Проверяя, что фокус потерян для другого элемента управления, вы говорите пользователю: «Не переходите к этому компоненту - вы еще не заполнили текущий правильно!».

Он лучше фиксирует намерения пользователя, чем проверка любого изменения фокуса. Он также не запускает проверку, когда пользователь нажимает кнопку «Закрыть», кнопку «Х» системы или любую другую кнопку. Конечно, вам нужно будет добавить явную проверку при нажатии кнопки ОК.

Мало того, что это довольно просто для кодирования (проверьте, что новое окно фокуса является дочерним элементом диалогового окна и является компонентом ввода - вы можете определить, что это компонент ввода, посмотрев на имя класса окна в окне. поля редактирования.)

Это также относится к случаям, когда пользователь смещает фокус по другим причинам, таким как окно системного сообщения или другое событие захвата фокуса. Поскольку фокус не перемещается на один из ваших других элементов управления редактированием, проверка не запускается, и фокус не возвращается к вашему приложению, что может быть довольно раздражающим для некоторых людей!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...