2013-09-12 3 views
0

У меня есть еще один вопрос wxWidgets относительно событий и фокуса.wxWidgets event focus textcontrol

Я уже посмотрел на учебниках и этот старый вопрос здесь, но я до сих пор работаю с проблемами C++ Event (Focus) Handling

В принципе у меня есть диалог с двумя элементами wxTextCtrl и Баттоном. То, что я хотел бы достичь, заключается в том, что, когда я нажимаю на кнопку, мне нужно сказать, какой из двух элементов ранее имел фокус.

В конструкторе моего диалога, я создал все элементы, а затем соединили их к EventHandler, как это: Ttop->Connect(TOP,wxEVT_KILL_FOCUS,(wxObjectEventFunction)&UI_ADDENTRY::hasfocus); Tbottom->Connect(BOTTOM,wxEVT_KILL_FOCUS,(wxObjectEventFunction)&UI_ADDENTRY::hasfocus);

то есть EventHandler, что сейфы ид в фокусе

void UI_ADDENTRY::hasfocus(wxFocusEvent& event){ 
    focus= event.GetId(); 
    event.Skip();} 

однако когда я пытаюсь получить доступ к фокусу в функции Button, которую он всегда говорит мне: 0 вместо TOP или BOTTOM/идентификаторы, которые я дал текстовым управлениям

void UI_ADDENTRY::OnRecord(wxCommandEvent &event){ 
    wxString tmp; 
    tmp << this->focus; 
    wxMessageBox(tmp);} 

Что я делаю неправильно? есть ли другой способ узнать, какой из двух текстовых полей был в центре внимания?

Спасибо

+0

Не могли бы вы просто проверить 'Ttop-> HasFocus()' и 'Tbottom-> HasFocus()' в вашем обработчике кликов? –

+0

Я пробовал это изначально ... как это правильно, если (Ttop-> HasFocus()) { wxMessageBox ("TOP"); }, но, похоже, не все верно. –

+0

Нажав кнопку, вы удалите фокус с wxTextCtrl. Если он устанавливает условие гонки, которое может дать основание для этого лишь иногда возвращать true. –

ответ

0

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

FWIW EVT_KILL_FOCUS, к сожалению, не может быть последовательно реализован на всех платформах, в частности GTK + не дает никакой информации о фокусе окна, теряется.

+0

Спасибо за ответ, но я уже пробовал это. У меня есть int id; как член моего класса. Затем я написал это в обработчике событий: hasfocus (wxFocusEvent & event) {this-> id = event.GetId(); но id всегда 0 event.Skip();} –

+0

'event.GetId()' не совпадает с 'id', который является членом вашего класса ... Вместо этого используйте' GetEventObject() '. –

0

В виду u mean event.GetWindow(). GetId(). Хотя я не уверен, как ур кастинг от int до строки.

Смежные вопросы