3

wxWidgets 2.9 と wxComboBox AutoComplete 機能に関する問題があります。以下は、ComboBox の ENTER イベントを受け取るイベント テーブルです。入力時に OnComboEnter を起動します。これを行うと、ユーザーが ComboBox に入力したテキストに対して OnComboEnter メソッドを直接実行するため、AutoComplete リストから項目を選択できません。

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 を処理できるようにイベント処理を変更して、ユーザーが最初に項目を選択できるようにする方法です (または、項目をまったく選択しない可能性があります) Enter キーを押してイベントと 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 を使用できましたが、そのコントロールでオートコンプリートが機能せず、その理由がわかりません。

于 2012-08-25T08:35:57.800 に答える