4、wxWidgets菜单和工具栏

Wesley13
• 阅读 669

一、菜单

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

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这