wxWidgets 2.9自动完成wxComboBox自定义EnterEvent

时间:2012-07-11 08:08:14

标签: c++ event-handling wxwidgets

我有一个关于wxWidgets 2.9和wxComboBox自动完成功能的问题。下面是我的事件表,它接受我的ComboBox的ENTER事件,输入I fire OnComboEnter。如果我这样做,我无法从自动完成列表中选择一个项目,因为它直接在用户键入ComboBox的文本上执行OnComboEnter方法。

BEGIN_EVENT_TABLE(LVFilterPanel, wxPanel)
   EVT_TEXT_ENTER(wxID_ANY, LVFilterPanel::OnComboEnter)
   EVT_CONTEXT_MENU(LVFilterPanel::OnComboContextMenu)
END_EVENT_TABLE()

我的ComboBox声明如下:

mFilterString = new wxComboBox(this, LV_FILTER_STRING, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER);

AutoComplet使用wxWidgets 2.9中的默认AutoComplete方法完成:

mFilterString->AutoComplete(historyarr);

historyarr是一个wxArrayString,填充了之前由用户输入的字符串。 OnComboEnter方法如下所示:

void LVFilterPanel::OnComboEnter(wxCommandEvent& event) {
    wxCommandEvent ce(wxEVT_COMMAND_BUTTON_CLICKED, LV_FILTER);
    static_cast<wxButton*>(FindWindow(LV_FILTER))->Command(ce);
}

我现在的问题是,如何以能够首先选择项目然后处理OnComboEnter的方式更改事件处理,以便用户能够首先选择项目(或者可以不选择项目all并直接按Enter键启动事件和OnComboEnter方法)。 提前谢谢。

映入眼帘,

Roin

2 个答案:

答案 0 :(得分:2)

如果你需要在标准处理发生后执行你的事件处理程序,通常的做法是在你的事件处理程序中做任何事情(当然这也意味着调用event.Skip()!)除了设置一些内部标志和在EVT_IDLE处理程序中检查此标志。如果已设置,则执行您需要的任何操作(例如,在您的情况下为button->Command())并重置标记。

这种方法可确保处理程序在事件发生后“很快”运行,而不会干扰正常的事件处理。

答案 1 :(得分:1)

我有同样的问题,但wxTextCtrl,这是我的解决方案:

TextCtrl2 = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));

TextCtrl2->SetHint("Search...");
TextCtrl2->AutoComplete(m_AutoCompleteChoices);
TextCtrl2->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(StartFrame::OnKeyDown),NULL, this);


void StartFrame::OnKeyDown(wxKeyEvent& event)
{
    switch (event.GetKeyCode()) {
    case WXK_RETURN:
        QueryCache(TextCtrl2->GetValue()); // <- This is anything to do!
        break;
    }
    event.Skip();
}

我可以使用wxSearchCtrl但是Autocomplete不能在该控件中工作,我不知道为什么。