本教程原文鏈接: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(280, 180)) { 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(280, 180)) { 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(280, 180)) { 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(280, 180)) { 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, 0, wxEXPAND); vbox->Add(toolbar2, 0, 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教程中,我們介紹了菜單欄和工具欄。