Tartalomjegyzék

< 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.

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

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.

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

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.

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

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.

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

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