我想知道如何使用Bind函数在wxWidgets 3.0,C ++中创建一个简单的事件处理程序。
为了开始我的实验,我创建了一个非常简单的应用程序 - 一个带有菜单的主框架和菜单中的几个项目。到目前为止没有任何问题,所有都出现了预期我使用的代码的一部分是:
//create a menu bar
wxMenuBar* mbar = new wxMenuBar();
wxMenu* fileMenu = new wxMenu(_T(""));
fileMenu->Append(item1, _("&Item_1"), _("Select item 1"));
mbar->Append(fileMenu, _("&File"));
现在我想使用Bind创建一个简单的处理程序,如果从菜单中选择Item_1,它会弹出一个消息框,例如:
wxMessageBox( "You have selected Item 1", "Your selection", wxOK | wxICON_INFORMATION );
请注意,弹出一个消息框只是我选择快速掌握概念并查看结果的一个简单示例。如果可能的话,我希望Bind事件处理程序尽可能通用,用于任意事件和操作。
答案 0 :(得分:2)
#include <wx/wx.h>
#define item1 (wxID_HIGHEST + 1)
class CApp : public wxApp
{
public:
bool OnInit() {
// Create the main frame.
wxFrame * frame = new wxFrame(NULL, wxID_ANY, "demo");
// Create a menu bar.
wxMenuBar* mbar = new wxMenuBar();
wxMenu* fileMenu = new wxMenu(_T(""));
fileMenu->Append(item1, _("&Item_1"), _("Select item 1"));
mbar->Append(fileMenu, _("&File"));
frame->SetMenuBar(mbar);
// Bind an event handling method.
#if __cplusplus < 201103L
frame->Bind(wxEVT_MENU, &CApp::item1_OnMenu, this, item1);
#else
frame->Bind(wxEVT_MENU, [](wxCommandEvent & evt)->void{
wxMessageBox("You have selected Item 1", "Your selection", wxOK | wxICON_INFORMATION);
}, item1);
#endif
// Enter the message loop.
frame->Show(true);
return this->wxApp::OnInit();
}
#if __cplusplus < 201103L
protected:
void item1_OnMenu(wxCommandEvent & evt) {
wxMessageBox("You have selected Item 1", "Your selection", wxOK | wxICON_INFORMATION);
}
#endif
};
DECLARE_APP(CApp)
IMPLEMENT_APP(CApp)
方法wxEvtHandler::Bind
有3个重载。以上只展示了其中的2个。
对于可用的事件类型,它将是Bind
的第一个参数,请参阅wx / event.h。 event.h还告诉我们应该使用哪个事件类。例如,
#define EVT_MENU(winid, func) wx__DECLARE_EVT1(wxEVT_MENU, winid, wxCommandEventHandler(func))
注意wxCommandEventHandler
,删除后缀Handler
,剩下的将是事件类wxCommandEvent
。