[[: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