#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