3

我有一个关于 wxWidgets 2.9 和 wxComboBox AutoComplete 功能的问题。下面是我的事件表,它接受我的 ComboBox 的 ENTER 事件,在输入时我触发 OnComboEnter。如果这样做,我将无法从 AutoComplete 列表中选择一个项目,因为它直接对用户键入 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,以便用户能够先选择项目(或者可能根本不选择项目直接按回车键启动事件和 OnComboEnter 方法)。提前致谢。

问候,

罗因

4

2 回答 2

2

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

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

于 2012-07-11T10:34:53.470 回答
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 在该控件中不起作用,我不知道为什么。

于 2012-08-25T08:35:57.800 回答