在特定点抑制wxWidgets事件以防止相互处理

时间:2011-07-13 10:07:54

标签: events wxwidgets

我有一个带有两个TextControl的WxWidget面板供用户输入。一个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更改时,它会正确地更改另一个TextControl的值。但是,只要文本在其他输入中更改,它就会自动上升TEXT_UPDATE事件并更新当前用户的输入,从而导致有趣的游标跳跃等。

是否可以在更改其他TextControl的值时提供这些事件的执行,以便它不会上升其TEXT_UPDATE事件?如果用户为自己的文本控件做了一些输入,它应该照常工作。

1 个答案:

答案 0 :(得分:4)

也许您可以使用wxTextCtrl::ChangeValue

virtual void ChangeValue(const wxString& value)
  

设置文本值并将控件标记为未修改(这意味着IsModified将在调用SetValue后立即返回false。

     

请注意,此函数不会生成wxEVT_COMMAND_TEXT_UPDATED事件。这是与SetValue的唯一区别。有关详细信息,请参阅此主题。