2015-12-29 2 views
1

У меня есть wxDialog с somes wxTextCtrl в нем. Мне нужно подключать события, когда эти wxTextCtrl получают и теряют фокус. В частности, каждый wxTextCtrl имеет текст по умолчанию. Когда пользователь прикасается к нему для записи, текст по умолчанию исчезает, и он позволяет пользователю писать с самого начала. Эта часть предназначена для wxEVT_SET_FOCUS.Can't Connect Focus Events в wxWIdgets 3.0 C++

Затем, если пользователь ничего не пишет и покидает wxTextCtrl, я снова устанавливаю текст по умолчанию. И эта часть для wxEVT_KILL_FOCUS. Однако я не мог подключить textctrl к событиям. Я уже пробовал:

Connect(wxTXTCRLID , wxEVT_SET_FOCUS , wxFocusEventHandler(MyDialog::OnFocus) , nullptr , this); 

Это тоже:

Bind(wxEVT_SET_FOCUS , &MyDialog::OnFocus , this , wxTXTCRLID); 

С таблицы событий тоже:

BEGIN_EVENT_TABLE(MyDialog , wxDialog) 
     EVT_SET_FOCUS(MyDialog::OnFocus) 
END_EVENT_TABLE() 

И это:

BEGIN_EVENT_TABLE(MyDialog , wxDialog) 
     EVT_COMMAND_SET_FOCUS(wxTXTCRLID , MyDialog::OnFocus) 
END_EVENT_TABLE() 

В примерах таблицы событий, я обязательно объявить его в файле заголовка. Но никто из них не работал. My OS is Ubuntu 14.04 Если вам нужна дополнительная информация, просто дайте мне знать.

ответ

1

wxFocusEvent не является wxCommandEvent, поэтому он не будет распространен родителям по умолчанию, и вы никогда не получите его для дочернего окна в диалоговом окне. Вы должны вызвать Bind() над дочерним элементом управления, а не самим диалогом (и вы не можете легко это сделать с таблицами событий).

Однако, прежде чем вы измените это, я думаю, что есть гораздо более простое и лучшее решение: просто используйте SetHint() и не беспокойтесь о том, чтобы реализовать поддержку для ввода текста.

+0

Спасибо! оно работает. Но я все еще не понимаю, и мне нужно знать, как я могу подключить wxtextctrl (или другой дочерний элемент) с функцией события фокуса, потому что мне нужно это сейчас для другой цели. Как я могу это сделать? –

+1

Самый простой способ - использовать 'Bind()', но вам нужно вызвать его непосредственно в объекте управления текстом, т. Е. 'Text-> Bind (wxEVT_SET_FOCUS, & MyDialog :: OnTextFocus, dialog)'. –

+0

Спасибо. Оно работает! –

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