头文件:
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()。
答案 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}}的处理程序。