wxWidgets программно переходит к следующему элементу управления вводом

#c 11 #wxwidgets #keyevent #programmatically

#c 11 #wxwidgets #keyevent #программно

Вопрос:

Изначально у меня был код, который устанавливал фокус на первый виджет в диалоговом окне в методе OnInit. Но с этим были проблемы: если я нажал TAB, фокус действительно переместился на следующий элемент управления (wxTextCtrl), который получил синий цвет «фокус», но цвет / подсветка «фокус» не был удален из предыдущего виджета фокуса. Итак, теперь это выглядело так, как будто и первый, и второй элемент управления были сфокусированы одновременно…

При циклическом циклировании вручную (нажатием TAB) полного круга (до последнего элемента управления, а затем обтекания до первого), внезапно все сработало хорошо. То есть при перемещении фокуса с первого элемента управления на следующий первый визуально потерял фокус (синий цвет был удален), как и должно быть. С этого момента только один элемент имел цвет / выделение фокуса.

Поэтому вместо установки фокуса на первом элементе управления я попробовал другой подход: я установил фокус на последний элемент управления в диалоговом окне, который всегда является кнопкой OK. Далее я хочу программно эмулировать нажатие вкладки и получение ее в диалоговом окне. Итак, я написал это (внутренний диалог::OnInit):

     m_buttonOK->SetFocus();
    wxKeyEvent key;
    key.SetEventObject(this);
    key.SetEventType(wxEVT_CHAR);
    key.m_keyCode=WXK_TAB;
    ProcessWindowEvent(key);
  

Теперь фокус действительно смещается с кнопки OK, но он не переносится на первый элемент управления.
Только когда я вручную нажимаю TAB после открытия диалогового окна, первый элемент получает фокус.

Вопрос: почему это обтекание для установки фокуса на первый виджет не работает с кодом, показанным выше?

Комментарии:

1. у вас есть wxPanel в качестве родительского элемента для всех ваших элементов управления или вы сами управляете вкладками?

Ответ №1:

Прежде всего, ваша первоначальная проблема почти наверняка связана с тем, что вы не вызываете event.Skip() один из ваших обработчиков событий, см. Примечание в документации wxFocusEvent .

Во-вторых, вы не можете отправлять события wx в собственные окна, они ничего об этом не знают. В этом конкретном случае вы можете использовать wxWindow::Navigate(), чтобы делать то, что вы хотите, но, вообще говоря, то, что вы делаете просто, не может и не будет работать надежно.

Комментарии:

1. У меня есть только обработчики событий для трех кнопок: отмена, ОК и восстановление. Поэтому я не думаю, что проблема в том, чтобы забыть event.Skip(), спасибо за совет для wxWindow::Navigate(), я посмотрю документацию и попробую.

2. Все, что я могу сказать, это то, что единственный способ заставить более одного элемента управления выглядеть так, как если бы он был сфокусирован, — это обработка, а не пропуск wxFocusEvent ., Если вы найдете другой способ сделать это, пожалуйста, попробуйте воспроизвести его с наименьшим количеством кода и откройте для него ошибку, потому что это будет ошибка.

3. Привет, я не обрабатываю wxFocusEvent. У меня нет времени на создание такого примера в обозримом будущем… Мне нужно сосредоточиться на текущей работе. Возможно, позже. Но, хотя мне очень нравятся wxWidgets и Qt, вероятно, я буду использовать Uno в будущем. platform.uno