[ZETCODE]wxWidgets教程四:菜單欄和工具欄


本教程原文鏈接:http://zetcode.com/gui/wxwidgets/menustoolbars/

翻譯:瓶哥

日期:2013年11月28日星期四

郵箱:414236069@qq.com

主頁: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;

};
View Code

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

}
View Code

main.h

#include <wx/wx.h>

 

class MyApp : public wxApp

{

public:

virtual bool OnInit();

};
View Code

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;

}
View Code

 

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;

};
View Code

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

}
View Code

main.h

#include <wx/wx.h>

 

class MyApp : public wxApp

{

public:

virtual bool OnInit();

};
View Code

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;

}
View Code

 

我們在文件菜單中創建了一個子菜單,這是一個導入子菜單。

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

};
View Code

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

}
View Code

main.h

#include <wx/wx.h>

 

class MyApp : public wxApp

{

public:

virtual bool OnInit();

};
View Code

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;

}
View Code

 

在我們的例子中,我們創建了一個工具欄和一個工具按鈕,單擊那個按鈕會終止程序運行。

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;

};
View Code

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

}
View Code

main.h

#include <wx/wx.h>

 

class MyApp : public wxApp

{

public:

virtual bool OnInit();

};
View Code

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;

}
View Code

 

在我們的例子中,我們創建了兩個水平的工具欄,並且把它們放置到一個垂直的布局控件中。

toolbar1 = new wxToolBar(this, wxID_ANY);

……

toolbar2 = new wxToolBar(this, wxID_ANY);

這里我們創建了兩個工具欄。

vbox->Add(toolbar1, 0, wxEXPAND);

vbox->Add(toolbar2, 0, wxEXPAND);

這里我們把他們添加進垂直的布局控件中。

在這一章的wxWidgets教程中,我們介紹了菜單欄和工具欄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM