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

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

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

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

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

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

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


person user2943111    schedule 27.09.2020    source источник
comment
у вас есть wxPanel в качестве родителя для всех ваших элементов управления или вы сами управляете TABbing?   -  person Igor    schedule 28.09.2020


Ответы (1)


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

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

person VZ.    schedule 28.09.2020
comment
У меня есть обработчики событий только для трех кнопок: «Отмена», «ОК» и «Восстановить». Поэтому я не думаю, что здесь проблема в том, чтобы забыть о event.Skip(). Спасибо за подсказку для wxWindow::Navigate(), я посмотрю документацию и попробую. - person user2943111; 29.09.2020
comment
Все, что я могу сказать, это то, что единственный способ получить более одного элемента управления, как если бы он был в фокусе, - это обработать, а не пропустить, wxFocusEvent. Если вы найдете другой способ сделать это, попробуйте воспроизвести его с наименьшим количеством кода и откройте для него ошибку, потому что это будет ошибка. - person VZ.; 29.09.2020
comment
Привет, я не обрабатываю wxFocusEvent. У меня нет времени делать такой пример в обозримом будущем... Мне нужно сосредоточиться на текущей работе. Возможно позже. Но хотя мне очень нравятся wxWidgets и Qt, возможно, в будущем я буду использовать Uno. platform.uno - person user2943111; 30.09.2020