[[:oktatas:programozás:wxwidgets:wxWidgets kézikönyv|< wxWidgets kézikönyv]]
====== Párbeszédek ======
A párbeszédablakok az grafikus alkalmazások alapvető részei. A párbeszéd kettő vagy több személy közötti beszélgetést jelent.
A számítógépes programoknál a párbeszéd egy ablak és felhasználó közötti párbeszéd. A párbeszéd lehet
adatok bekérése, adatok módosítása, az alkalmazás beállításainak megváltoztatása, stb. A párbeszéd ezért nagyon
fontos dolog a számítógép és az ember között.
Alapvetően két típus van a párbeszédeknek. Előre meghatározott párbeszéd és az összetett párbeszéd.
===== Összetett párbeszédek =====
Az előre meghatározott párbeszédek a wxWidgets eszközkészletében adottak. Olyan programozási feladatokra vannak párbeszéd lehetőségek mint egy
szöveg megmutatása, értékek bekérése, fájlok betöltése, mentése, stb. A programozó ezzel időt takarít meg, és növeli a program viselkedésének
színvonalát.
===== Üzenet párbeszédek =====
Az üzenetablakok a felhasználót értesítik egy üzenetről. Ez testreszabható. Kicserélhetjük a párbeszéd ablak ikonjait, gombjait
az üzenetablakon belül.
#include
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;
#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();
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#include "main.h"
#include "Messages.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
Messages *msgs = new Messages(wxT("Messages"));
msgs->Show(true);
return true;
}
Példánkban készítettünk négy gombot, amelyet a grid méretezőben helyeztünk el. A gombok négy különböző párbeszédablakban fognak megjelenni.
Különböző speciális stílussal készítjük azokat.
wxMessageDialog *dial = new wxMessageDialog(NULL,
wxT("Error loading file"), wxT("Error"), wxOK | wxICON_ERROR);
dial->ShowModal();
Az elkészített üzenetablak egyszerű. Az párbeszédablakot felsőszintű (toplevel) ablaknak állítottuk be, vagyis nincs szülő, azaz a szülő az NULL.
A két karaktersorozat szolgáltatja a magát az üzenetet és a párbeszédablak címét. Megjelenítünk egy ok gombot és egy hiba-ikont, amit a wxOK és a
wxICON_ERROR jelzők jelentenek. A párbeszédablakok megjelenítéséhez a ShowModel() metódust használjuk.
Információs, Kérdő, riasztó és hiba párbeszédablakok
wxFileDialog
Ez egy általános fájl megnyitó és mentő párbeszédablak.
#include
class Openfile : public wxFrame
{
public:
Openfile(const wxString& title);
void OnOpen(wxCommandEvent& event);
wxTextCtrl *tc;
};
#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);
}
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#include "main.h"
#include "openfile.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
Openfile *open = new Openfile(wxT("Openfile"));
open->Show(true);
return true;
}
A példánkban, megjelenítünk egy fájlmenüpont és egy egyszerű szövegkontrollt. Ha kattintunk a fájl megnyitás menüpontra egy wxFileDialog jelenik meg. Betölthetünk szöveges fájlokat a szövegkontrollba.
tc = new wxTextCtrl(this, -1, wxT(""), wxPoint(-1, -1),
wxSize(-1, -1), wxTE_MULTILINE);
Betöltjük a szöveges fájlokat a szövegkontrollba.
wxFileDialog * openFileDialog = new wxFileDialog(this);
Itt készítünk egy wxFileDialog-ot. Az alapértelmezett paraméterezést használjuk. (Az fájlmegnyitás párbeszéd ablak az alapértelmezett.)
if (openFileDialog->ShowModal() == wxID_OK)
{
wxString fileName = openFileDialog->GetPath();
tc->LoadFile(fileName);
}
Itt megjelenítünk a párbeszédablakot. Megkapjuk a kiválasztott fájlnevet és betöltjük a szövegkontrollba.
wxFileDialog
Figure: wxFileDialog on Linux
===== wxFontDialog =====
Ez egy általános font választó párbeszédablak.
#include
class ChangeFont : public wxFrame
{
public:
ChangeFont(const wxString& title);
void OnOpen(wxCommandEvent& event);
wxStaticText *st;
};
const int ID_FONTDIALOG = 1;
#include
#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());
}
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#include "main.h"
#include "fontdialog.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
ChangeFont *change = new ChangeFont(wxT("Change font"));
change->Show(true);
return true;
}
Ebben a példában, lecseréljük a statikus szövegpélda fontját.
st = new wxStaticText(panel, wxID_ANY, wxT("The Agoge"),
wxPoint(20, 20));
Itt megjelenítjük a statikus szöveget a panelen. Ki fogjuk cserélni a fontot a wxFontDialog használatával.
wxFontDialog *fontDialog = new wxFontDialog(this);
if (fontDialog->ShowModal() == wxID_OK)
{
st->SetFont(fontDialog->GetFontData().GetChosenFont());
}
Ebben a kódsorban, mejelenítjük a font párbeszédablakot. Kiválasztunk egy fontot. Végezetül, a statikus szöveg fontját lecseréljük.
Font dialog
Figure: Font dialog
===== Egy testreszabható párbeszédablak =====
A példánkban egy testreszabható párbeszédablakot készítünk. Egy képszerkesztő alkalmazás megváltoztathatja egy kép színmélységét.
Ennek a funkciónak a bemutatásához készítünk egy megfelelő testreszabható párbeszédablakot.
#include
class CustomDialog : public wxDialog
{
public:
CustomDialog(const wxString& title);
};
#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();
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#include "main.h"
#include "customdialog.h"
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
CustomDialog *custom = new CustomDialog(wxT("CustomDialog"));
custom->Show(true);
return true;
}
Ez a példa egy párbeszéd alapú alkalmazás. Bemutatjuk, hogyan készítünk testreszabható párbeszédablakot.
class CustomDialog : public wxDialog
A testreszabható párbeszédablak a wxDialog osztályon alapszik.
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);
Jegyezze meg, hogy a wxStaticBox komponenst kell készíteni a tartalmazó komponens előtt, és ez a komponens testvére és nem gyermeke lesz a statikus doboznak.
ShowModal();
Destroy();
A párbeszédablak képernyőn való megjelenítéséhez, meghívjuk a ShowModal() metódust. A memóriából való törléshez, meghívjuk a Destroy() metódust.
Testreszabható metódus.
Figure: Custom dialog