[ZETCODE]wxWidgets教程四:菜单栏和工具栏
本教程原文链接:http://zetcode.com/gui/wxwidgets/menustoolbars/
翻译:瓶哥
日期:2013年11月28日星期四
主页:http://www.cnblogs.com/pingge/
若有翻译错误或者歧义请联系我!
一个菜单条是一个应用程序最主要的可见部分之一,它是一组在菜单上的各种各样的命令。在控制台程序里你不得不记住这些神秘的命令,在菜单栏里我们把大部分的命令包装到菜单里。这是进一步减少学习一个新的程序所花费的时间的标准工具。要在wxWidgets里使用菜单栏,我们要有三样东西:wxMenuBar, wxMenu, wxMenuItem。
一个使用菜单栏的简单例子
menu.h
#include <wx/wx.h> #include <wx/menu.h> class SimpleMenu : public wxFrame { public: SimpleMenu(const wxString & title); void OnQuit(wxCommandEvent & event); wxMenuBar * menubar; wxMenu * file; };
menu.cpp
#include "menu.h" SimpleMenu::SimpleMenu(const wxString & title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, )) { menubar = new wxMenuBar; file = new wxMenu; file->Append(wxID_EXIT, _T("&Quit\tCtrl-Q"), _T("Quit the program")); menubar->Append(file, _T("&File")); SetMenuBar(menubar); Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SimpleMenu::OnQuit)); Centre(); } void SimpleMenu::OnQuit(wxCommandEvent & event) { Close(true); }
main.h
#include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); };
main.cpp
#include "main.h" #include "menu.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { SimpleMenu * menu = new SimpleMenu(_T("Simple Menu")); menu->Show(true); return true; }
menubar = new wxMenuBar;
首先我们创建了一个菜单栏对象。
file = new wxMenu
然后我们创建一个菜单对象。
File->Append(wxID_EXIT, _T("&Quit\tCtrl-Q"));
我们把一个菜单选项添加进菜单对象。第一个参数是是菜单选项的ID,第二个参数选项的名称,第三个选项是提示字符串。在这里,我们没有明确地建立一个wxMenuItem对象,它是被Append()方法隐式创建的,接下来的例子我们将演示如何手动创建wxMenuItem对象。
Menubar->Append(file, _T("&File"));
SetMenuBar(menubar);
最后,我们把这个菜单添加进菜单栏,字符&建立了一种以快捷键来操作的方式,这个程序你可以使用Ctrl+Q来关闭程序。最后我们调用了SetMenuBar()方法,这个方法属于wxFrame组件,它设置了菜单栏。
子菜单
每一个菜单都可以有一个子菜单,这样我们可以把相似的命令放到一个子菜单中。例如,我们可以显示或隐藏各种工具栏(地址栏、状态栏、导航栏)的选项添加到子菜单中。在一个菜单中我们可以使用分隔符把命令分开,分隔符是一条简单的线段。把像新建、打开、保存之类的命令和打印、打印预览之类的命令用一个简单分隔符分开是很容易做到的。在我们的例子中,我们会看到如何创建一个子菜单和一个菜单分隔符。
menu.h
#include <wx/wx.h> #include <wx/menu.h> class SubMenu : public wxFrame { public: SubMenu(const wxString & title); void OnQuit(wxCommandEvent & event); wxMenuBar * menubar; wxMenu * file; wxMenu * imp; wxMenuItem * quit; };
menu.cpp
#include "menu.h" SubMenu::SubMenu(const wxString & title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, )) { menubar = new wxMenuBar; file = new wxMenu; file->Append(wxID_ANY, wxT("&New")); file->Append(wxID_ANY, wxT("&Open")); file->Append(wxID_ANY, wxT("&Save")); file->AppendSeparator(); imp = new wxMenu; imp->Append(wxID_ANY, wxT("Import newsfeed list...")); imp->Append(wxID_ANY, wxT("Import bookmarks...")); imp->Append(wxID_ANY, wxT("Import mail...")); file->AppendSubMenu(imp, _T("I&mport")); quit = new wxMenuItem(file, wxID_EXIT, _T("&Quit\tCtrl+Q")); file->Append(quit); menubar->Append(file, _T("&File")); SetMenuBar(menubar); Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubMenu::OnQuit)); Centre(); } void SubMenu::OnQuit(wxCommandEvent & event) { Close(true); }
main.h
#include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); };
main.cpp
#include "main.h" #include "menu.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { SubMenu * menu = new SubMenu(_T("SubMenu")); menu->Show(true); return true; }
我们在文件菜单中创建了一个子菜单,这是一个导入子菜单。
File->AppendSeparator();
使用AppendSeparator()方法创建了一个菜单分隔符。
Imp = new wxMenu;
imp->Append(wxID_ANY, wxT("Import newsfeed list..."));
imp->Append(wxID_ANY, wxT("Import bookmarks..."));
imp->Append(wxID_ANY, wxT("Import mail..."));
file->AppendSubMenu(imp, _T("I&mport"));
一个子菜单像普通的菜单一样被创建,它被AppendSubMenu()添加进菜单。
工具栏
菜单把所有程序的命令组合在一起,而工具栏提供一种快速操作最频繁使用的命令的方法。
Virtual wxToolBar * CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL, wxWindowID id = -1, const wxString & name = "toolBar");
要创建一个工具栏,我们可以在frame组件内调用CreateToolBar()方法。
一个简单的工具栏
我们第一个例子会创建一个简单的工具栏。
toolbar.h
#include <wx/wx.h> class Toolbar : public wxFrame { public: Toolbar(const wxString & title); void OnQuit(wxCommandEvent & event); };
toolbar.cpp
#include "toolbar.h" Toolbar::Toolbar(const wxString & title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, )) { wxImage::AddHandler(new wxPNGHandler); wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG); wxToolBar * toolbar = CreateToolBar(); toolbar->AddTool(wxID_EXIT, exit, _T("Exit application")); toolbar->Realize(); Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(Toolbar::OnQuit)); Centre(); } void Toolbar::OnQuit(wxCommandEvent & WXUNUSED(event)) { Close(true); }
main.h
#include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); };
main.cpp
#include "main.h" #include "toolbar.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Toolbar * toolbar = new Toolbar(_T("Toolbar")); toolbar->Show(true); return true; }
在我们的例子中,我们创建了一个工具栏和一个工具按钮,单击那个按钮会终止程序运行。
wxToolBar * toolbar = CreateToolBar();
我们创建了一个工具栏。
Toolbar->AddTool(wxID_EXIT, exit, _T("Exit application"));
我们把一个工具添加到工具栏。
Toolbar->Realize();
在我们添加完工具后,我们调用Realize()方法实现这个工具栏。
工具栏
如果我们想要多个工具栏,我们必须用不同的方法去创建它们。
toolbars.h
#include <wx/wx.h> class Toolbar : public wxFrame { public: Toolbar(const wxString & title); void OnQuit(wxCommandEvent & event); wxToolBar * toolbar1; wxToolBar * toolbar2; };
toolbars.cpp
#include "toolbars.h" Toolbar::Toolbar(const wxString & title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, )) { wxImage::AddHandler(new wxPNGHandler); wxBitmap exit(_T("exit.png"), wxBITMAP_TYPE_PNG); wxBitmap newb(_T("new.bmp"), wxBITMAP_TYPE_BMP); wxBitmap open(_T("open.bmp"), wxBITMAP_TYPE_BMP); wxBitmap save(_T("save.bmp"), wxBITMAP_TYPE_BMP); wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL); toolbar1 = new wxToolBar(this, wxID_ANY); toolbar1->AddTool(wxID_ANY, newb, _T("")); toolbar1->AddTool(wxID_ANY, open, _T("")); toolbar1->AddTool(wxID_ANY, save, _T("")); toolbar1->Realize(); toolbar2 = new wxToolBar(this, wxID_ANY); toolbar2->AddTool(wxID_EXIT, exit, _T("Exit application")); toolbar2->Realize(); vbox->Add(toolbar1, , wxEXPAND); vbox->Add(toolbar2, , wxEXPAND); SetSizer(vbox); Connect(wxID_EXIT, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(Toolbar::OnQuit)); Centre(); } void Toolbar::OnQuit(wxCommandEvent & WXUNUSED(event)) { Close(true); }
main.h
#include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); };
main.cpp
#include "main.h" #include "toolbars.h" IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { Toolbar * toolbar = new Toolbar(_T("Toolbar")); toolbar->Show(true); return true; }
在我们的例子中,我们创建了两个水平的工具栏,并且把它们放置到一个垂直的布局控件中。
toolbar1 = new wxToolBar(this, wxID_ANY);
……
toolbar2 = new wxToolBar(this, wxID_ANY);
这里我们创建了两个工具栏。
vbox->Add(toolbar1, 0, wxEXPAND);
vbox->Add(toolbar2, 0, wxEXPAND);
这里我们把他们添加进垂直的布局控件中。
在这一章的wxWidgets教程中,我们介绍了菜单栏和工具栏。
[ZETCODE]wxWidgets教程四:菜单栏和工具栏的更多相关文章
- [ZETCODE]wxWidgets教程八:组件专题1
本教程原文链接:http://zetcode.com/gui/wxwidgets/widgets/ 翻译:瓶哥 日期:2013年12月12日星期四 邮箱:414236069@qq.com 主页:htt ...
- [ZETCODE]wxWidgets教程七:对话框
本教程原文链接:http://zetcode.com/gui/wxwidgets/dialogs/ 翻译:瓶哥 日期:2013年12月9日星期一 邮箱:414236069@qq.com 主页:http ...
- [ZETCODE]wxWidgets教程五:布局管理
本教程原文链接:http://zetcode.com/gui/wxwidgets/layoutmanagement/ 翻译:瓶哥 日期:2013年12月4日星期三 邮箱:414236069@qq.co ...
- [ZETCODE]wxWidgets教程六:事件处理
本教程原文链接:http://zetcode.com/gui/wxwidgets/events/ 翻译:瓶哥 日期:2013年12月7号星期六 邮箱:414236069@qq.com 主页:http: ...
- [ZETCODE]wxWidgets教程三:第一个窗体程序
本教程原文链接:http://zetcode.com/gui/wxwidgets/firstprograms/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...
- [ZETCODE]wxWidgets教程九:组件专题2
本教程原文链接:http://zetcode.com/gui/wxwidgets/widgetsII/ 翻译:瓶哥 日期:2013年12月15日星期日 邮箱:414236069@qq.com 主页:h ...
- [ZETCODE]wxWidgets教程二:辅助类
本教程原文链接:http://zetcode.com/gui/wxwidgets/helperclasses/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...
- Qt5教程: (6) 菜单栏、工具栏、状态栏及核心控件
1. 新建QMainWindow工程 取消生成.ui文件 2. 菜单栏 在mainwindow.cpp中添加头文件 和 #include <QMenuBar> #include <Q ...
- [ZETCODE]wxWidgets教程一:介紹
本教程原文链接:http://zetcode.com/gui/wxwidgets/introduction/ 翻译:瓶哥 日期:2013年11月26日星期二 邮箱: 414236069@qq.com ...
随机推荐
- 九度OJ 1086 最小花费--动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1086 题目描述: 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对 ...
- [翻译][MVC 5 + EF 6] 3:排序、过滤、分页
原文:Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application 1.添加排序: 1. ...
- 锋利的Jquery解惑系列(一)------基本概念大锅炖
声明:虽然是基本概念但也是笔者经过一番学习才总结的这些文章,所以他不包括Jquery优缺点.特点.语法的介绍. 概念一:jQuery对像与DOM对象 DOM(Document Object Model ...
- Spring in action笔记
耦合的两面性 一方面代码耦合难以测试,会出现打地鼠式的bug特性(修复一个bug,引发另一个bug) 另一方面耦合又是必须的,不同的类必须要进行适当的交互,才能实现功能. bean的四种装配方 ...
- PHP AOP
看到一篇好文,果断收藏 点击打开链接http://www.cnblogs.com/afritxia2008/archive/2010/07/03/1770427.html
- SQL Cursor(游标)
1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要 ...
- c#集合解析
什么是集合(collection)? 提供了一种结构化组织任意对象的方式,从.NET 的角度看,所谓的集合可以定义为一种对象,这种对象实现一个或者多个System.Collections.IColle ...
- 安装mod_deflate模块启用apache的GZIP压缩
安装mod_deflate模块启用apache的GZIP压缩 操作系统:Linux Cent OS 5 / Max OS X 10.6 snow leopard相关环境:Apache httpd 2. ...
- zzuli oj 1167逆转数(指针专题)
Description 任意给你一个整数,这个数可能很大(最长不超过100位),你能求出它的逆转数吗? 逆转数定义如下: 1.一个末尾没有0的整数,它的逆转数就是各位数字逆序输出: 2.一个负数 ...
- Android中的pix,sp,dp相关概念
px( pixel) 像素,可以简单的理解为一个点或方块,用以颜色的显示(单位),一般指印刷品或屏幕设置设备的颜色显示定义. dip(device independent pixels)设备独立像素. ...