一、按钮
在接下来的这个例子中,我们在框架上创建了一个按钮。我们将会看到,如何建立一个简单的事件处理程序。在这个实例中,为按钮绑定处理事件,使用的是静态时间表的方法
1 BEGIN_EVENT_TABLE(MyFrame, wxFrame) 2 EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) 3 EVT_MENU(wxID_EXIT, MyFrame::OnQuit) 4 EVT_BUTTON(wxID_EXIT, MyFrame::OnQuit) 5 END_EVENT_TABLE()
main.h
1 #include <wx/wx.h> 2 //定义主窗口类 3 class MyFrame : public wxFrame 4 { 5 public: 6 MyFrame(const wxString& title); 7 8 //定义事件处理函数 9 void OnQuit(wxCommandEvent& event); 10 void OnAbout(wxCommandEvent& event); 11 private: 12 //声明事件表 13 DECLARE_EVENT_TABLE() 14 15 }; 16 //定义应用程序类 17 class MyApp : public wxApp 18 { 19 public: 20 virtual bool OnInit(); 21 };
main.cpp
1 #include "main.h" 2 #include "icon.xpm" 3 4 MyFrame::MyFrame(const wxString& title) 5 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) 6 { 7 //定义菜单 8 wxMenu *menuFile = new wxMenu; 9 menuFile->Append(wxID_EXIT, wxT("Exit ... Alt+X"), wxT("Quit this program")); 10 11 wxMenu *menuHelp = new wxMenu; 12 menuHelp->Append(wxID_ABOUT, wxT("&About ... F1"), wxT("Show about frame")); 13 14 //定义菜单栏 15 wxMenuBar *menuBar = new wxMenuBar; 16 17 //向菜单栏添加菜单 18 menuBar->Append(menuFile, wxT("&File")); 19 menuBar->Append(menuHelp, wxT("&Help")); 20 21 //将菜单栏添加到wxFrame中 22 SetMenuBar(menuBar); 23 24 //添加状态栏 25 CreateStatusBar(); 26 //将状态栏分为两栏 27 //CreateStatusBar(2); 28 //添加状态栏显示内容 29 SetStatusText(wxT("Welcome to wxWidgets!")); 30 31 //设置应用显示图标 32 SetIcon(wxIcon(icon_xpm)); 33 34 //在wxFrame组件中定义了一个Panel容器,用于放置Button按钮 35 wxPanel * panel = new wxPanel(this, wxID_ANY); 36 //添加一个按钮 37 wxButton * button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20)); 38 button->SetFocus();//按钮自动获取焦点 39 40 41 Centre(); 42 } 43 //声明应用程序 44 IMPLEMENT_APP(MyApp) 45 46 //初始化应用程序 47 bool MyApp::OnInit() 48 { 49 MyFrame *myframe = new MyFrame(wxT("MyFrame")); 50 myframe->Show(true); 51 52 return true; 53 } 54 55 //定义事件表,完成事件和处理函数的映射 56 BEGIN_EVENT_TABLE(MyFrame, wxFrame) 57 EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) 58 EVT_MENU(wxID_EXIT, MyFrame::OnQuit) 59 EVT_BUTTON(wxID_EXIT, MyFrame::OnQuit) 60 END_EVENT_TABLE() 61 62 //事件处理函数的实现 63 void MyFrame::OnAbout(wxCommandEvent& event) 64 { 65 wxString msg; 66 //设置msg的内容 67 msg.Printf(wxT("About hello wxWidgets"), wxVERSION_STRING); 68 //定义弹出框的内容和标题 69 wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this); 70 } 71 72 void MyFrame::OnQuit(wxCommandEvent& event) 73 { 74 Close(true); 75 }
窗口界面如下:
二、组件之间通信
下面是一个组件之间相互通信的例子,在这个实例中,由于每个按钮需要多次点击,因此,为按钮绑定事件处理函数,使用的动态关联时间处理函数的方法。
静态与动态事件处理函数关联方法的区别,我们会在后面讲事件处理机制中具体讲到。
main.h
1 #include <wx/wx.h> 2 #include <wx/panel.h> 3 #include <wx/wxprec.h> 4 #include <wx/stattext.h> 5 6 const int ID_PLUS = 101; 7 const int ID_MINUS = 102; 8 9 //定义左侧面板 10 class LeftPanel : public wxPanel 11 { 12 public: 13 LeftPanel(wxPanel * parent); 14 15 void OnPlus(wxCommandEvent & event); 16 void OnMinus(wxCommandEvent & event); 17 18 wxButton * m_plus; 19 wxButton * m_minus; 20 wxPanel * m_parent; 21 int count; 22 }; 23 //定义右侧面板 24 class RightPanel : public wxPanel 25 { 26 public: 27 RightPanel(wxPanel * parent); 28 29 void OnSetText(wxCommandEvent & event); 30 //静态文本控件 31 wxStaticText * m_text; 32 }; 33 34 //定义主窗口类 35 class MyFrame : public wxFrame 36 { 37 public: 38 MyFrame(const wxString& title); 39 //定义成员变量 40 LeftPanel * m_lp; 41 RightPanel * m_rp; 42 43 wxPanel * m_parent; 44 45 //定义事件处理函数 46 void OnQuit(wxCommandEvent& event); 47 void OnAbout(wxCommandEvent& event); 48 private: 49 //声明静态事件表 50 DECLARE_EVENT_TABLE() 51 52 }; 53 //定义应用程序类 54 class MyApp : public wxApp 55 { 56 public: 57 virtual bool OnInit(); 58 };
main.cpp
1 #include "main.h" 2 #include "icon.xpm" 3 4 LeftPanel::LeftPanel(wxPanel * parent) 5 : wxPanel(parent, wxID_ANY, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN) 6 { 7 //定义一个计数变量 8 count = 0; 9 //定义父panel 10 m_parent = parent; 11 //定义两个按钮 12 m_plus = new wxButton(this, ID_PLUS, _T("+"), wxPoint(10, 10)); 13 m_minus = new wxButton(this, ID_MINUS, _T("-"), wxPoint(10, 60)); 14 15 //定义动态关联事件处理函数 16 Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(LeftPanel::OnPlus)); 17 Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(LeftPanel::OnMinus)); 18 19 } 20 21 void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event)) 22 { 23 //更新计数变量 24 count++; 25 //获取父panel指针 26 MyFrame * comm = (MyFrame *)(m_parent->GetParent()); 27 //设置静态文本框的值 28 comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count)); 29 } 30 31 void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event)) 32 { 33 //更新计数变量 34 count--; 35 //获取父panel指针 36 MyFrame * comm = (MyFrame *)(m_parent->GetParent()); 37 //设置静态文本框的值 38 comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count)); 39 } 40 41 //定义右侧panel 42 RightPanel::RightPanel(wxPanel * parent) 43 : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(270, 150), wxBORDER_SUNKEN) 44 { 45 //定义一个静态文本框 46 m_text = new wxStaticText(this, -1, _T("0"), wxPoint(40, 60)); 47 } 48 49 //实现主窗口类 50 MyFrame::MyFrame(const wxString& title) 51 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)) 52 { 53 //定义菜单 54 wxMenu *menuFile = new wxMenu; 55 menuFile->Append(wxID_EXIT, wxT("Exit ... Alt+X"), wxT("Quit this program")); 56 57 wxMenu *menuHelp = new wxMenu; 58 menuHelp->Append(wxID_ABOUT, wxT("&About ... F1"), wxT("Show about frame")); 59 60 //定义菜单栏 61 wxMenuBar *menuBar = new wxMenuBar; 62 63 //向菜单栏添加菜单 64 menuBar->Append(menuFile, wxT("&File")); 65 menuBar->Append(menuHelp, wxT("&Help")); 66 67 //将菜单栏添加到wxFrame中 68 SetMenuBar(menuBar); 69 70 //添加状态栏 71 CreateStatusBar(); 72 //将状态栏分为两栏 73 //CreateStatusBar(2); 74 //添加状态栏显示内容 75 SetStatusText(wxT("Welcome to wxWidgets!")); 76 77 //设置应用显示图标 78 SetIcon(wxIcon(icon_xpm)); 79 80 //定义父panel 81 m_parent = new wxPanel(this, wxID_ANY); 82 //定义一个wxBoxSizer 83 wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL); 84 //定义左右panel 85 m_lp = new LeftPanel(m_parent); 86 m_rp = new RightPanel(m_parent); 87 //将左右panel加入到wxBoxSizer 88 hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5); 89 hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5); 90 //将wxBoxSizer加载到父panel 91 m_parent->SetSizer(hbox); 92 93 //使整个wxFrame框架位于屏幕中间 94 Centre(); 95 } 96 97 //声明应用程序 98 IMPLEMENT_APP(MyApp) 99 100 //初始化应用程序 101 bool MyApp::OnInit() 102 { 103 MyFrame *myframe = new MyFrame(wxT("MyFrame")); 104 myframe->Show(true); 105 106 return true; 107 } 108 109 //定义静态事件表,完成事件和处理函数的映射 110 BEGIN_EVENT_TABLE(MyFrame, wxFrame) 111 EVT_MENU(wxID_ABOUT, MyFrame::OnAbout) 112 EVT_MENU(wxID_EXIT, MyFrame::OnQuit) 113 END_EVENT_TABLE() 114 115 //事件处理函数的实现 116 void MyFrame::OnAbout(wxCommandEvent& event) 117 { 118 wxString msg; 119 //设置msg的内容 120 msg.Printf(wxT("About hello wxWidgets"), wxVERSION_STRING); 121 //定义弹出框的内容和标题 122 wxMessageBox(msg, wxT("About wxWidgets"), wxOK | wxICON_INFORMATION, this); 123 } 124 125 void MyFrame::OnQuit(wxCommandEvent& event) 126 { 127 Close(); 128 }
窗口界面如下:
点击左侧的加减按钮,右侧的数据会同步更新。