Подавить событие wxWidgets в определенный момент, чтобы предотвратить взаимную обработку - PullRequest
1 голос
/ 13 июля 2011

У меня есть панель WxWidget с двумя TextControls для пользовательского ввода.Один ввод TextControl изменяет значение другого поля ввода.Я использовал событие EVT_COMMAND_TEXT_UPDATE и связал его с функцией, подобной «OnValueChanged» ...

mTextCtrl1->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MyClass::OnTextCtrlChanged1), NULL, this);
mTextCtrl2->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(MyClass::OnTextCtrlChanged2), NULL, this);

void MyClass::OnTextCtrlChanged1(wxCommandEvent &event) {
  // ...
  mTextCtrl2->SetValue(...); // Set a Hex value of entered Value in text ctrl 1
}

void MyClass::OnTextCtrlChanged2(wxCommandEvent &event) {
  // ...
  mTextCtrl1->SetValue(...); // Set a Integer value of entered Value in text ctrl 2

  // at this point, MyClass::OnTextCtrl1 is handled, 
  // but should not, only if user himself enters something

}

Проблема в том, что при изменении Text в одном TextControl значение другого корректно изменяется.Но, как только текст изменяется в другом вводе, он вызывает свое собственное событие TEXT_UPDATE и обновляет текущие пользовательские вводы, что приводит к забавным скачкам курсора и т. Д.

Можно ли обеспечить выполнение этих событий при изменениизначение другого TextControl, чтобы оно не вызывало событие TEXT_UPDATE?Если пользователь самостоятельно вводит данные в этот текстовый элемент управления, он должен работать как обычно.

1 Ответ

4 голосов
/ 13 июля 2011

Возможно, вы можете использовать wxTextCtrl::ChangeValue

virtual void ChangeValue(const wxString& value)

Устанавливает текстовое значение и помечает элемент управления как неизмененный (что означает, что IsModified вернет false сразу после вызова SetValue).

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

...