Запутанные текстовые поля - PullRequest
3 голосов
/ 04 января 2011

Простое текстовое поле Windows очень удивило меня сегодня.

У меня есть два несвязанных текстовых поля внутри приложения.Я могу ввести любое текстовое поле и переключить фокус, нажав на них.Затем происходит какое-то событие X, которое я не могу описать здесь по причинам, указанным ниже.После того, как это событие происходит, два текстовых поля становятся «запутанными» почти квантовым способом.

Скажем, текстовое поле A было сфокусировано до появления X.Когда я нажимаю текстовое поле B, чтобы ввести какой-либо текст, новый текст появляется в текстовом поле A, тогда как мигающий курсор счастливо перемещается в текстовом поле B через пустоту, как если бы текст был там.

Никакое количество нажатий на текстовые поля не может решить эту проблему.Курсор всегда будет оставаться в B, тогда как текст всегда будет идти к A.

Шпионаж сообщения показывает, что после события X текстовые поля теряют способность терять или получать фокус.Когда я нажимаю на B, WM_LOSE_FOCUS не приходит к A, а WM_SET_FOCUS не приходит к B. (Прямоугольники и видимость полей в порядке.)

То же самое происходит в Windows XP и Windows 7.

Теперь событие X: это большое событие в сторонней библиотеке пользовательского интерфейса, которое я не могу своевременно перепроектировать.(А именно, закрепление панели в wxAUI.)

Я уверен, что это поведение является результатом неправильных вызовов WinAPI к текстовым полям (вход мусора - выход мусора).Я хотел бы знать, что может вызвать такое «отключение текстового поля», чтобы знать, с чего начать поиск ошибки.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 04 января 2011

Я нашел проблему.Это был я.В управлении фокусом была глупая ошибка.Это привело к быстрой (немедленной) передаче фокуса в текстовое поле B, а затем обратно в текстовое поле A сразу после «события X».И хотя это произошло только один раз, этого было достаточно, чтобы разрушить текстовые поля до конца их жизни.

Почему спецэффекты?Оказывается, что Windows ненавидит две быстрые последовательные манипуляции с элементами пользовательского интерфейса.Однажды у меня была такая же странная ошибка, когда я пытался переместить элемент управления, установив его происхождение и размер в два разных этапа.Контроль будет вести себя очень случайно после этого.Только когда я переместил его правильно - за один шаг - странность прекратилась.

Спасибо за ваше внимание и извините за беспокойство.

1 голос
/ 04 января 2011

Это довольно странно, и, не имея возможности взглянуть на какой-то код, лучшее, что я могу сделать, - это обоснованное предположение.

Мне кажется, что библиотека пользовательского интерфейса обрабатывает уведомления (нажатие клавиши, фокусировка)и т. д.) для текстового поля B и действуя на них так, как если бы они предназначались для текстового поля A. Как и переменная типа activeTextBox, которая содержит дескриптор текстового поля A, даже если она должна указывать на текстовое поле B.

В то время как я могу представить ошибку библиотеки UI, вызывающую такое поведение, я думаю, что гораздо более вероятно, что клиентский код вызовет ее.Вы исключили свой код в качестве виновника?

0 голосов
/ 04 января 2011

У текстовых полей есть уникальные идентификаторы?

Вы правильно связали их сообщения и обработчики сообщений?

В частности, похоже, что элемент управления, у которого есть событие X, может иметь идентификаторы суб-элементов управления, которые конфликтуют с вашими идентификаторами элементов управления.

если проблема воспроизводима, я бы сделал небольшой тестовый пример и отправил бы его поставщику элемента управления.

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