使用EVT_NAVIGATION_KEY处理事件不起作用

时间:2015-01-31 20:14:02

标签: c++ events controls wxwidgets

头文件:

class ttFrame: public wxFrame
{
    public:
        ttFrame(wxFrame *frame, const wxString& title);
        ~ttFrame();
    private:
        enum
        {
            idMenuQuit = 1000,
            idMenuAbout,
            collapsible_key
        };
        void OnClose(wxCloseEvent& event);
        void OnQuit(wxCommandEvent& event);
        void OnAbout(wxCommandEvent& event);
        void OnEvent(wxCommandEvent& event);
        void OnSpinEvent(wxSpinEvent& event);
        wxCollapsiblePane *collpane;
        void OnEventCollapsible(wxNavigationKeyEvent& event);
        DECLARE_EVENT_TABLE()
};

主要功能:

wxBoxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);

collpane = new wxCollapsiblePane(this, collapsible_key, "Collapsible pane:", wxDefaultPosition, wxSize(400,400), wxCP_NO_TLW_RESIZE);
sizer->Add(collpane);

    wxWindow *win = collpane->GetPane();
    wxSizer *paneSz = new wxBoxSizer(wxVERTICAL);

    paneSz->Add(new wxStaticText(win, wxID_ANY, "test!"), 1, wxGROW|wxALL, 2);

    win->SetSizer(paneSz);
    paneSz->SetSizeHints(win);

SetSizer(sizer);

活动声明:

BEGIN_EVENT_TABLE(ttFrame, wxFrame)
    EVT_NAVIGATION_KEY(ttFrame::OnEventCollapsible)
END_EVENT_TABLE()

事件功能发射器:

void ttFrame::OnEventCollapsible(wxNavigationKeyEvent& event)
{
    wxMessageBox("Not event trigger on key TAB");
}

当我单击TAB键或某个功能键时,它不会触发事件。其他事件,如EVT_COLLAPSIBLEPANE_CHANGED(id,func):有效。

在文档中说

  

EVT_NAVIGATION_KEY(func):处理导航键事件。

事件不会触发显示wxMessageBox()。

1 个答案:

答案 0 :(得分:1)

据我所知,wxFrame不会发出wxNavigationKeyEvent。获取TAB导航的标准方法是添加wxPanel作为wxFrame的唯一子项,然后将所有控件添加为wxPanel的子项。文档here

更新:我错了,我刚刚确认wxFrame 实际上也发出了该事件。与wxPanel的不同之处在于,没有默认的导航处理程序 - 除非您自己执行此操作,TAB无法在控件之间导航直接添加到wxFrame

但是,在您的情况下,您还有另一个wxPanel - wxCollapsiblePane中包含的collpane->GetPane()->Bind(/*...*/)。您还需要将事件处理程序绑定到该面板(wxCollapsiblePane)以捕获其事件。

在这两个处理程序之间,您应该捕获所有相关的导航事件。

更新2:wxPanel也实现了导航,因此当焦点从窗格外部切换到其包含的wxCollapsiblePane并返回时,绑定处理程序也将捕获其他事件。不知道这怎么可能有用。如果collpane->GetPane()的内部面板中至少添加了两个控件,为了捕获它们之间的导航事件,您仍然需要绑定到{{1}}的处理程序。