一、菜单
下面是一个简单的菜单实例:
main.h
1 #include <wx/wx.h> 2 #include <wx/menu.h> 3 //定义主窗口类 4 class MyApp : public wxApp 5 { 6 public: 7 virtual bool OnInit(); 8 }; 9 10 //定义应用程序类 11 class MyFrame : public wxFrame 12 { 13 public: 14 MyFrame(const wxString & title); 15 //定义事件处理函数 16 void OnQuit(wxCommandEvent & event); 17 //定义菜单条 18 wxMenuBar * menubar; 19 //定义菜单项 20 wxMenu * file; 21 };
main.cpp
1 #include "main.h" 2 //实现主框架类 3 MyFrame::MyFrame(const wxString & title) 4 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180)) 5 {
menubar = new wxMenuBar;
file = new wxMenu; 6 //为菜单项添加内容 7 file->Append(wxID_EXIT, _T("&Quit Ctrl-Q"), _T("Quit the program")); 8 //设置菜单条的内容 9 menubar->Append(file, _T("&File")); 10 //将菜单项加载到菜单条上 11 SetMenuBar(menubar); 12 //为菜单添加处理函数 13 Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit)); 14 //使窗口居中 15 Centre(); 16 } 17 18 void MyFrame::OnQuit(wxCommandEvent & event) 19 { 20 Close(true); 21 } 22 //声明应用程序 23 IMPLEMENT_APP(MyApp) 24 25 bool MyApp::OnInit() 26 { 27 MyFrame * menu = new MyFrame(_T("Menu")); 28 menu->Show(true); 29 30 return true; 31 }
File->Append(wxID_EXIT, _T("&Quit Ctrl-Q"));
我们把一个菜单选项添加进菜单对象。第一个参数是是菜单选项的ID,第二个参数选项的名称,第三个选项是提示字符串。在这里,我们没有明确地建立一个wxMenuItem对象,它是被Append()方法隐式创建的,接下来的例子我们将演示如何手动创建wxMenuItem对象。
Menubar->Append(file, _T("&File"));
SetMenuBar(menubar);
最后,我们把这个菜单添加进菜单栏,字符&建立了一种以快捷键来操作的方式,这个程序你可以使用Ctrl+Q来关闭程序。最后我们调用了SetMenuBar()方法,这个方法属于wxFrame组件,它设置了菜单栏。
二、子菜单
每一个菜单都可以有一个子菜单,这样我们可以把相似的命令放到一个子菜单中。例如,我们可以显示或隐藏各种工具栏(地址栏、状态栏、导航栏)的选项添加到子菜单中。在一个菜单中我们可以使用分隔符把命令分开,分隔符是一条简单的线段。把像新建、打开、保存之类的命令和打印、打印预览之类的命令用一个简单分隔符分开是很容易做到的。在我们的例子中,我们会看到如何创建一个子菜单和一个菜单分隔符。
main.h
1 #include <wx/wx.h> 2 #include <wx/menu.h> 3 //定义主窗口类 4 class MyApp : public wxApp 5 { 6 public: 7 virtual bool OnInit(); 8 }; 9 10 //定义应用程序类 11 class MyFrame : public wxFrame 12 { 13 public: 14 MyFrame(const wxString & title); 15 //定义事件处理函数 16 void OnQuit(wxCommandEvent & event); 17 //定义菜单条 18 wxMenuBar * menubar; 19 //定义菜单项 20 wxMenu * file; 21 wxMenu * imp; 22 23 wxMenuItem * quit; 24 };
main.cpp
1 #include "main.h" 2 //实现主框架类 3 MyFrame::MyFrame(const wxString & title) 4 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180)) 5 { 6 menubar = new wxMenuBar; 7 8 file = new wxMenu; 9 //为菜单项添加内容 10 //file->Append(wxID_EXIT, _T("&Quit Ctrl-Q"), _T("Quit the program")); 11 file->Append(wxID_ANY, _T("&New")); 12 file->Append(wxID_ANY, _T("&Open")); 13 file->Append(wxID_ANY, _T("&Save")); 14 //在菜单条中创建一个分隔符 15 file->AppendSeparator(); 16 //为菜单imp定义子菜单 17 imp = new wxMenu; 18 imp->Append(wxID_ANY, _T("Import newsfeed list...")); 19 imp->Append(wxID_ANY, _T("Import bookmarks...")); 20 imp->Append(wxID_ANY, _T("Import mail...")); 21 //将拥有子菜单的菜单加载到file中 22 file->AppendSubMenu(imp, _T("I&mport")); 23 //创建一个wxMenuItem 24 quit = new wxMenuItem(file, wxID_EXIT, _T("&Quit Ctrl+Q")); 25 //将新创建的微信MenuItem加载到file中 26 file->Append(quit); 27 28 //设置菜单条的内容 29 menubar->Append(file, _T("&File")); 30 //将菜单项加载到菜单条上 31 SetMenuBar(menubar); 32 //为菜单添加处理函数 33 Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MyFrame::OnQuit)); 34 //使窗口居中 35 Centre(); 36 } 37 38 void MyFrame::OnQuit(wxCommandEvent & event) 39 { 40 Close(true); 41 } 42 //声明应用程序 43 IMPLEMENT_APP(MyApp) 44 45 bool MyApp::OnInit() 46 { 47 MyFrame * menu = new MyFrame(_T("SubMenu")); 48 menu->Show(true); 49 50 return true; 51 }
三、工具栏
菜单把所有程序的命令组合在一起,而工具栏提供一种快速操作最频繁使用的命令的方法。
Virtual wxToolBar * CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL, wxWindowID id = -1, const wxString & name = "toolBar");
要创建一个工具栏,我们可以在frame组件内调用CreateToolBar()方法。
下面是一个简单的工具栏实例。
main.h
1 #include <wx/wx.h> 2 3 //定义主窗口类 4 class MyApp : public wxApp 5 { 6 public: 7 virtual bool OnInit(); 8 }; 9 10 //定义应用程序类 11 class MyFrame : public wxFrame 12 { 13 public: 14 MyFrame(const wxString & title); 15 //定义事件处理函数 16 void OnQuit(wxCommandEvent & event); 17 };
main.cpp
1 #include "main.h" 2 //实现主框架类 3 MyFrame::MyFrame(const wxString & title) 4 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(280, 180)) 5 { 6 //初始化PNG图像处理模块 7 wxImage::AddHandler(new wxPNGHandler); 8 //生成exit.png图片 9 wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG); 10 //创建工具栏 11 wxToolBar * toolbar = CreateToolBar(); 12 //将exit加载到工具栏 13 toolbar->AddTool(wxID_EXIT, exit, _T("Exit application")); 14 //调用Realize()方法实现工具栏 15 toolbar->Realize(); 16 //动态关联事件处理函数 17 Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(MyFrame::OnQuit)); 18 19 Centre(); 20 } 21 22 void MyFrame::OnQuit(wxCommandEvent & event) 23 { 24 Close(true); 25 } 26 //声明应用程序 27 IMPLEMENT_APP(MyApp) 28 29 bool MyApp::OnInit() 30 { 31 MyFrame * menu = new MyFrame(_T("ToolBar")); 32 menu->Show(true); 33 34 return true; 35 }
在我们的例子中,我们创建了一个工具栏和一个工具按钮,单击那个按钮会终止程序运行。
wxToolBar * toolbar = CreateToolBar();
我们创建了一个工具栏。
Toolbar->AddTool(wxID_EXIT, exit, _T("Exit application"));
我们把一个工具添加到工具栏。
Toolbar->Realize();
在我们添加完工具后,我们调用Realize()方法实现这个工具栏。
如果我们想要多个工具栏,我们必须用不同的方法去创建它们。
main.h
1 #include <wx/wx.h> 2 3 //定义主窗口类 4 class MyApp : public wxApp 5 { 6 public: 7 virtual bool OnInit(); 8 }; 9 10 //定义应用程序类 11 class MyFrame : public wxFrame 12 { 13 public: 14 MyFrame(const wxString & title); 15 //定义事件处理函数 16 void OnQuit(wxCommandEvent & event); 17 18 wxToolBar * toolbar1; 19 wxToolBar * toolbar2; 20 };
main.cpp
1 #include "main.h" 2 //实现主框架类 3 MyFrame::MyFrame(const wxString & title) 4 : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(480, 380)) 5 { 6 //初始化PNG图像处理模块 7 wxImage::AddHandler(new wxPNGHandler); 8 //生成exit.png图片 9 wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG); 10 wxBitmap newb(_T("new.png"), wxBITMAP_TYPE_PNG); 11 wxBitmap open(_T("open.png"), wxBITMAP_TYPE_PNG); 12 wxBitmap save(_T("save.png"), wxBITMAP_TYPE_PNG); 13 //创建了一个锤子布局控件 14 wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL); 15 //创建工具栏 16 toolbar1 = CreateToolBar(); 17 toolbar1->AddTool(wxID_ANY, newb, _T("")); 18 toolbar1->AddTool(wxID_ANY, open, _T("")); 19 toolbar1->AddTool(wxID_ANY, save, _T("")); 20 //调用Realize()方法实现工具栏 21 toolbar1->Realize(); 22 23 toolbar2 = new wxToolBar(this, wxID_ANY); 24 toolbar2->AddTool(wxID_EXIT, exit, _T("Exit application")); 25 toolbar2->Realize(); 26 27 vbox->Add(toolbar1, 0, wxEXPAND); 28 vbox->Add(toolbar2, 0, wxEXPAND); 29 30 SetSizer(vbox); 31 //动态关联事件处理函数 32 Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(MyFrame::OnQuit)); 33 34 Centre(); 35 } 36 37 void MyFrame::OnQuit(wxCommandEvent & event) 38 { 39 Close(true); 40 } 41 //声明应用程序 42 IMPLEMENT_APP(MyApp) 43 44 bool MyApp::OnInit() 45 { 46 MyFrame * menu = new MyFrame(_T("ToolBar")); 47 menu->Show(true); 48 49 return true; 50 }
在我们的例子中,我们创建了两个水平的工具栏,并且把它们放置到一个垂直的布局控件中。
toolbar1 = new wxToolBar(this, wxID_ANY); …… toolbar2 = new wxToolBar(this, wxID_ANY);
这里我们创建了两个工具栏。
vbox->Add(toolbar1, 0, wxEXPAND); vbox->Add(toolbar2, 0, wxEXPAND);
这里我们把他们添加进垂直的布局控件中。