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

Руководство по WxWidgets: 6. Диалоги

Просмотров: 2547Комментарии: 0
Статьи
Руководство по WxWidgets: 6. Диалоги

Диалоговые окна или диалоги необходимая часть большинства современных GUI приложений. Диалог определяет общение между двумя и более персонами. В приложении диалог - это окно, которое используется для "общения" с программой. Диалог используется для ввода данных, их изменения, изменения настроек приложения и т.д. Диалоги - это важное средство для коммуникации между пользователем и программой.

Те, кто дочитает главу до конца получат ссылки на остальные материалы курса.

Существует два типа диалогов: предопределённые и пользовательские.

Предопределённые диалоги

Предопределённые диалоги - это диалоги доступные в наборе инструментов wxWidgets (wxWidgets toolkit). Здесь есть диалоги для различных целей, например, вывод текста, получение данных, открытие и сохранение файлов и т.д. Всё это помогает программисту сэкономить время и повысить производительность труда.

Диалоги сообщений

Диалоги сообщений используются для вывода сообщений пользователю. Они настраиваемые. Мы можем изменить иконки и кнопки, которые будут показаны в диалоге.

Messages.h:
#include <wx/wx.h>
class Messages : public wxFrame
{
public:
	Messages(const wxString& title);
    
	void ShowMessage1(wxCommandEvent & event);
	void ShowMessage2(wxCommandEvent & event);
	void ShowMessage3(wxCommandEvent & event);
	void ShowMessage4(wxCommandEvent & event);
};
const int ID_INFO = 1;
const int ID_ERROR = 2;
const int ID_QUESTION = 3;
const int ID_ALERT = 4;
Messages.cpp:
#include "Messages.h"
Messages::Messages(const wxString& title)
	: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(210, 110))
{
	wxPanel *panel = new wxPanel(this, wxID_ANY);
	wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
	wxGridSizer *gs = new wxGridSizer(2, 2, 2, 2);
	wxButton *btn1 = new wxButton(panel, ID_INFO, wxT("Info"));
	wxButton *btn2 = new wxButton(panel, ID_ERROR, wxT("Error"));
	wxButton *btn3 = new wxButton(panel, ID_QUESTION, wxT("Question"));
	wxButton *btn4 = new wxButton(panel, ID_ALERT, wxT("Alert"));
	Connect(ID_INFO, wxEVT_COMMAND_BUTTON_CLICKED, 
		wxCommandEventHandler(Messages::ShowMessage1));
	Connect(ID_ERROR, wxEVT_COMMAND_BUTTON_CLICKED, 
		wxCommandEventHandler(Messages::ShowMessage2));
	Connect(ID_QUESTION, wxEVT_COMMAND_BUTTON_CLICKED, 
		wxCommandEventHandler(Messages::ShowMessage3));
	Connect(ID_ALERT, wxEVT_COMMAND_BUTTON_CLICKED, 
		wxCommandEventHandler(Messages::ShowMessage4));
	gs->Add(btn1, 1, wxEXPAND);
	gs->Add(btn2, 1);
	gs->Add(btn3, 1);
	gs->Add(btn4, 1);
	hbox->Add(gs, 0, wxALL, 15);
	panel->SetSizer(hbox);
	Center();
}
void Messages::ShowMessage1(wxCommandEvent& event) 
{
	wxMessageDialog *dial = new wxMessageDialog(NULL, 
		wxT("Download completed"), wxT("Info"), wxOK);
	dial->ShowModal();
}
void Messages::ShowMessage2(wxCommandEvent& event) 
{
	wxMessageDialog *dial = new wxMessageDialog(NULL, 
		wxT("Error loading file"), wxT("Error"), wxOK | wxICON_ERROR);
	dial->ShowModal();
}
void Messages::ShowMessage3(wxCommandEvent& event) 
{
	wxMessageDialog *dial = new wxMessageDialog(NULL, 
		wxT("Are you sure to quit?"), wxT("Question"), 
		wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
	dial->ShowModal();
}
void Messages::ShowMessage4(wxCommandEvent& event) 
{
	wxMessageDialog *dial = new wxMessageDialog(NULL, 
		wxT("Unallowed operation"), wxT("Exclamation"), 
		wxOK | wxICON_EXCLAMATION);
	dial->ShowModal();
}
main.h:
#include <wx/wx.h>
class MyApp : public wxApp
{
	public:
		virtual bool OnInit();
};
main.cpp:
#include "main.h"
#include "Messages.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	Messages *msgs = new Messages(wxT("Messages"));
	msgs->Show(true);
	return true;
}

В нашем примере мы создали четыре кнопки и поместили их в табличный классификатор. Эти кнопки выводят четыре различных диалога. Мы создали их, указав различные флаги стиля.

wxMessageDialog *dial = new wxMessageDialog(NULL, 
	wxT("Error loading file"), wxT("Error"), wxOK | wxICON_ERROR);
dial->ShowModal();

Создание диалога сообщения не представляет особых сложностей. Мы сделали диалоговое окно модальным (т.е. самым верхним) указав NULL в качестве родителя. Две строки выводят текст сообщения и заголовок диалога. Указав флаги wxOK и wxICON_ERROR мы создали кнопку OK и вывели значок ошибки. Для отображения диалога на экране использовали метод ShowModal().

Информация

Вопрос

Внимание

Ошибка

wxFileDialog

Это общий диалог для открытия и сохранения файлов.

openfile.h
#include <wx/wx.h>
class Openfile : public wxFrame
{
public:
	Openfile(const wxString& title);
	void OnOpen(wxCommandEvent& event);
	wxTextCtrl *tc;
};
openfile.cpp
#include "openfile.h"
Openfile::Openfile(const wxString & title)
	: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
{
	wxMenuBar *menubar = new wxMenuBar;
	wxMenu *file = new wxMenu;
	file->Append(wxID_OPEN, wxT("&Open"));
	menubar->Append(file, wxT("&File"));
	SetMenuBar(menubar);
	Connect(wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, 
		wxCommandEventHandler(Openfile::OnOpen));
	tc = new wxTextCtrl(this, -1, wxT(""), wxPoint(-1, -1), 
		wxSize(-1, -1), wxTE_MULTILINE);
	Center();
}
void Openfile::OnOpen(wxCommandEvent& event)
{
	wxFileDialog * openFileDialog = new wxFileDialog(this);
	if (openFileDialog->ShowModal() == wxID_OK){
		wxString fileName = openFileDialog->GetPath();
		tc->LoadFile(fileName);     
	}
}
main.h
#include <wx/wx.h>
class MyApp : public wxApp
{
	public:
		virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "openfile.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	Openfile *open = new Openfile(wxT("Openfile"));
	open->Show(true);
	return true;
}

В нашем примере мы создали пункт меню под названием "Open file" и простой многострочный текстовый элемент управления. При выборе этого пункта меню появится диалог wxFileDialog. Мы можем загрузить несколько простых текстовых файлов в текстовый элемент управления.

tc = new wxTextCtrl(this, -1, wxT(""), wxPoint(-1, -1), 
	wxSize(-1, -1), wxTE_MULTILINE);

Мы загрузили текстовые файлы в текстовый элемент управления.

wxFileDialog * openFileDialog = new wxFileDialog(this);

Здесь мы создали wxFileDialog. Мы использовали стандартные параметры (диалог файлового открытия является диалогом по умолчанию).

if (openFileDialog->ShowModal() == wxID_OK){
	wxString fileName = openFileDialog->GetPath();
	tc->LoadFile(fileName);     
 }

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

Рисунок 6.1: wxFileDialog в Linux

Рисунок 6.1: wxFileDialog в Linux

wxFontDialog

Это общий диалог выбора шрифта.

fontdialog.h
#include <wx/wx.h>
class ChangeFont : public wxFrame
{
public:
	ChangeFont(const wxString& title);
	void OnOpen(wxCommandEvent& event);
	wxStaticText *st;
};
const int ID_FONTDIALOG = 1;
fontdialog.cpp
#include <wx/fontdlg.h>
#include "fontdialog.h"
ChangeFont::ChangeFont(const wxString & title)
	: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
{
	wxPanel *panel = new wxPanel(this, -1);
	wxMenuBar *menubar = new wxMenuBar;
	wxMenu *file = new wxMenu;
	file->Append(ID_FONTDIALOG, wxT("&Change font"));
	menubar->Append(file, wxT("&File"));
	SetMenuBar(menubar);
	Connect(ID_FONTDIALOG, wxEVT_COMMAND_MENU_SELECTED, 
		wxCommandEventHandler(ChangeFont::OnOpen));
	st = new wxStaticText(panel, wxID_ANY, wxT("The Agoge"), 
		wxPoint(20, 20));
	Center();
}
void ChangeFont::OnOpen(wxCommandEvent& WXUNUSED(event))
{
	wxFontDialog *fontDialog = new wxFontDialog(this);
	if (fontDialog->ShowModal() == wxID_OK) {
		st->SetFont(fontDialog->GetFontData().GetChosenFont());
	}
}
main.h
#include <wx/wx.h>
class MyApp : public wxApp
{
	public:
		virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "fontdialog.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	ChangeFont *change = new ChangeFont(wxT("Change font"));
	change->Show(true);
	return true;
}

В этом примере мы можем менять шрифт статического текста.

st = new wxStaticText(panel, wxID_ANY, wxT("The Agoge"), 
	wxPoint(20, 20));

Здесь мы отображаем статический текст на панели. Мы можем изменять его шрифт, используя wxFontDialog.

wxFontDialog *fontDialog = new wxFontDialog(this);
if (fontDialog->ShowModal() == wxID_OK) {
	st->SetFont(fontDialog->GetFontData().GetChosenFont());
}

В этих строках описывается диалог выбора шрифта. Далее мы получаем выбранный шрифт. После этого мы изменяем статический текст, созданный ранее.

Рисунок 6.2: Выбор шрифта

Рисунок 6.2: Выбор шрифта

Пользовательский диалог

В следующем примере мы создали пользовательский диалог. Наш графический редактор может менять глубину цвета изображения. Чтобы обеспечить эту функциональность, мы создали диалог, подходящий для этого.

customdialog.h
#include <wx/wx.h>
class CustomDialog : public wxDialog
{
public:
	CustomDialog(const wxString& title);
};
customdialog.cpp
#include "customdialog.h"
CustomDialog::CustomDialog(const wxString & title)
	: wxDialog(NULL, -1, title, wxDefaultPosition, wxSize(250, 230))
{
	wxPanel *panel = new wxPanel(this, -1);
	wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
	wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
	wxStaticBox *st = new wxStaticBox(panel, -1, wxT("Colors"), 
		wxPoint(5, 5), wxSize(240, 150));
	wxRadioButton *rb = new wxRadioButton(panel, -1, 
		wxT("256 Colors"), wxPoint(15, 30), wxDefaultSize, wxRB_GROUP);
	wxRadioButton *rb1 = new wxRadioButton(panel, -1, 
		wxT("16 Colors"), wxPoint(15, 55));
	wxRadioButton *rb2 = new wxRadioButton(panel, -1, 
		wxT("2 Colors"), wxPoint(15, 80));
	wxRadioButton *rb3 = new wxRadioButton(panel, -1, 
		wxT("Custom"), wxPoint(15, 105));
	wxTextCtrl *tc = new wxTextCtrl(panel, -1, wxT(""), 
		wxPoint(95, 105));
	wxButton *okButton = new wxButton(this, -1, wxT("Ok"), 
		wxDefaultPosition, wxSize(70, 30));
	wxButton *closeButton = new wxButton(this, -1, wxT("Close"), 
		wxDefaultPosition, wxSize(70, 30));
	hbox->Add(okButton, 1);
	hbox->Add(closeButton, 1, wxLEFT, 5);
	vbox->Add(panel, 1);
	vbox->Add(hbox, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 10);
	SetSizer(vbox);
	Centre();
	ShowModal();
	Destroy(); 
}
main.h
#include <wx/wx.h>
class MyApp : public wxApp
{
	public:
		virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "customdialog.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
	CustomDialog *custom = new CustomDialog(wxT("CustomDialog"));
	custom->Show(true);
	return true;
}

Этот пример приложения базирующегося на диалоге. Здесь проиллюстрировано, как создать пользовательский диалог.

class CustomDialog : public wxDialog

Пользовательский диалог основан на классе wxDialog.

wxStaticBox *st = new wxStaticBox(panel, -1, wxT("Colors"), 
	wxPoint(5, 5), wxSize(240, 150));
wxRadioButton *rb = new wxRadioButton(panel, -1, 
	wxT("256 Colors"), wxPoint(15, 30), wxDefaultSize, wxRB_GROUP);

Запомните, что виджет wxStaticBox должен быть создан прежде виджетов его наполняющих, и они должны быть его братьями (т.е. элементами одного с ним уровня, иметь общего с ним родителя), а не его потомками.

ShowModal();
Destroy();

Для вывода диалога на экран используем метод ShowModal(). Для удаления диалога из памяти - метод Destroy().

Рисунок 6.3: Пользовательский диалог

Рисунок 6.3: Пользовательский диалог

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

Вступление

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

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

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

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

5. События

6. Диалоги

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

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

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

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

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

12. Тетрис в wxWidgets

Примечание

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

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

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