Sl-Alex домашняя лаборатория

Руководство по WxWidgets: 3. Меню и панели инструментов

Просмотров: 2494Комментарии: 0
Статьи
Руководство по WxWidgets: 3. Меню и панели инструментов

Строка меню

Строка меню одна из самых заметных частей интерфейса программы. Это группа команд, расположенных в различных подменю. Если в консоли Вы должны запоминать множество различных команд, здесь же большинство команд сгруппированы в логические части. Есть принятые стандарты, которые уменьшают количество времени, нужное для изучения нового приложения. Чтобы реализовать строку меню в wxWidgets, нам понадобится три вещи: wxMenuBar, wxMenu и wxMenuItem.

Ссылки на остальные материалы курса - в конце главы.

Рисунок 3.1: Строка меню

Рисунок 3.1: Строка меню

Простой пример меню

Создать новую строку меню в wxWidgets очень просто. Всего лишь несколько строк кода.

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, wxT("&Quit"));
	menubar->Append(file, wxT("&File"));
	SetMenuBar(menubar);
	Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED,
		wxCommandEventHandler(SimpleMenu::OnQuit));
	Centre();
}
void SimpleMenu::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 "menu.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	SimpleMenu *menu = new SimpleMenu(wxT("Simple Menu"));
	menu->Show(true);
	return true;
}
menubar = new wxMenuBar;

Сначала создаем объект строки меню.

file = new wxMenu;

Далее создаем объект меню.

file->Append(wxID_EXIT, wxT("&Quit"));

Мы добавляем элемент меню в объект меню. Первый параметр - это id элемента меню. Второй - имя элемента меню. Здесь мы не создаём wxMenuItem явно. Он создаётся методом Append() тайно. Позже мы создадим wxMenuItem вручную.

menubar->Append(file, wxT("&File"));
SetMenuBar(menubar);

После этого мы добавляем меню в строку меню. Символ & задаёт горячую клавишу. Символ, идущий за & подчёркивается. Теперь меню доступно через сочетание клавиш alt+"подчёркнутый символ" (в данном случае это сочетание alt+F). И в завершении мы вызываем метод SetMenuBar(). Это метод принадлежит виджету wxFrame. Он устанавливает строку меню.

Рисунок 3.2: Пример простого меню

Рисунок 3.2: Пример простого меню

Подменю

Каждое меню может иметь подменю. Это позволяет группировать сходные команды в соответствующие группы. Например, мы можем поместить команды которые скрывают/показывают различные панели инструментов, таких как персональная панель, адресная панель, панель статуса или навигационная панель, в подменю "панели". В меню мы можем разделить команды при помощи разделителя. Разделитель является простой линией. В основном он используется для отделения таких команд как "Создать", "Открыть", "Новый" от команд типа "Печать", "Предварительный просмотр" и т. д. В нашем примере мы рассмотрим как создавать подменю и разделители.

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, wxT("I&mport"));
	quit = new wxMenuItem(file, wxID_EXIT, wxT("&Quit\tCtrl+W"));
	file->Append(quit);
	menubar->Append(file, wxT("&File"));
	SetMenuBar(menubar);
	Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, 
		wxCommandEventHandler(SubMenu::OnQuit));
	Centre();
}
void SubMenu::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 "menu.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	SubMenu *smenu = new SubMenu(wxT("Submenu"));
	smenu->Show(true);
	return true;
}

Мы создали одно подменю в меню "File". Это подменю "Import", его вы можете встретить в браузере Opera.

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, wxT("I&mport"));

Подменю создано, как обычное меню. Оно добавлено посредством вызова метода AppendSubMenu().

Рисунок 3.3: Подменю

Рисунок 3.3: Подменю

Панели инструментов

В меню сгруппированы все команды, доступные в приложении. Панель инструментов обеспечивает быстрый доступ к наиболее используемым командам.

virtual wxToolBar* CreateToolBar(long style = wxNO_BORDER | wxTB_HORIZONTAL, 
              wxWindowID id = -1, const wxString& name = "toolBar")

Чтобы создать панель инструментов нужно вызвать метод 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))
{
	wxBitmap exit(wxT("exit.png"));
	wxToolBar *toolbar = CreateToolBar();
	toolbar->AddTool(wxID_EXIT, exit, wxT("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(wxT("Toolbar"));
	toolbar->Show(true);
	return true;
}

В нашем примере мы создали панель инструментов с одной кнопкой. Нажатие на эту кнопку панели инструментов завершает работу программы.

wxToolBar *toolbar = CreateToolBar();

Создаём новую панель инструментов.

toolbar->AddTool(wxID_EXIT, exit, wxT("Exit application"));

Добавляем инструмент на панель инструментов.

toolbar->Realize();

После того, как мы добавили инструменты, мы вызываем метод Realize().

Рисунок 3.4: Панель инструментов

Рисунок 3.4: Панель инструментов

Панели инструментов.

Если нам нужно больше одной панели инструментов, мы должны создать их не вызовом метода CreateToolbar(), а другим способом.

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(wxT("exit.png"), wxBITMAP_TYPE_PNG);
	wxBitmap newb(wxT("new.png"), wxBITMAP_TYPE_PNG);
	wxBitmap open(wxT("open.png"), wxBITMAP_TYPE_PNG);
	wxBitmap save(wxT("save.png"), wxBITMAP_TYPE_PNG);
	wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
	toolbar1 = new wxToolBar(this, wxID_ANY);
	toolbar1->AddTool(wxID_ANY, newb, wxT(""));
	toolbar1->AddTool(wxID_ANY, open, wxT(""));
	toolbar1->AddTool(wxID_ANY, save, wxT(""));
	toolbar1->Realize();
	toolbar2 = new wxToolBar(this, wxID_ANY);
	toolbar2->AddTool(wxID_EXIT, exit, wxT("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(wxT("Toolbar"));
	toolbar->Show(true);
	return true;
}

В нашем примере мы создали 2 горизонтальных панели инструментов и поместили их в вертикальный прямоугольный классификатор.

toolbar1 = new wxToolBar(this, wxID_ANY);
...
toolbar2 = new wxToolBar(this, wxID_ANY);

Здесь мы создаём две панели инструментов.

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

А здесь добавляем их в вертикальный прямоугольный классификатор.

Рисунок 3.5: Панели инструментов

Рисунок 3.5: Панели инструментов

Остальные материалы курса:

Вступление

1. Вспомогательные классы

2. Первые программы

3. Меню и панели инструментов

4. Управление компоновкой

5. События

6. Диалоги

7. Виджеты часть 1

8. Виджеты часть 2

9. Перетаскивание

10. Контексты устройств

11. Самодельные виджеты

12. Тетрис в wxWidgets

Примечание

Оригинал руководства расположен здесь. Автор оригинала - Jan Bodnar.

Перевод (без разметки и картинок) был выполнен пользователем ber113 с сайта translated.by. К сожалению, сайт сейчас не работает.

Данный документ представляет собой компиляцию указанных документов с сохранением оригинальной разметки и иллюстраций.