一、菜单
下面是一个简单的菜单实例:
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\tCtrl-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\tCtrl-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\tCtrl-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\tCtrl+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);
这里我们把他们添加进垂直的布局控件中。