Подавить событие wxWidgets в определенной точке, чтобы предотвратить взаимную обработку

У меня есть панель 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

}

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

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


person Benjamin    schedule 13.07.2011    source источник


Ответы (1)


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

virtual void ChangeValue(const wxString& value)

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

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

person tncas    schedule 13.07.2011