4、wxWidgets菜单和工具栏

一、菜单

下面是一个简单的菜单实例:

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);

这里我们把他们添加进垂直的布局控件中。

原文地址:https://www.cnblogs.com/Long-w/p/9585707.html