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