Tartalomjegyzék

< wxWidgets kézikönyv

Az első wxWidgets programajink

Először megnézzük hogyan kell készíteni egy alap wxWidget programot, majd megjelenítünk egy ikont. Utána egy egyszerű eseményt fogunk használni. Utána megnézzük, hogyan kommunikálnak a widgetek a wxWidget programmal.

Egy egyszerű alkalmazás

Először készítenünk kell egy alap wxWidgets programot.

simple.h
#include <wx/wx.h>
 
class Simple : public wxFrame
{
public:
    Simple(const wxString& title);
 
};
simple.cpp
#include "simple.h"
 
Simple::Simple(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
  Centre();
}
main.h
#include <wx/wx.h>
 
class MyApp : public wxApp
{
  public:
    virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "simple.h"
 
IMPLEMENT_APP(MyApp)
 
bool MyApp::OnInit()
{
    Simple *simple = new Simple(wxT("Simple"));
    simple->Show(true);
 
    return true;
}

Az eddigiek egy egyszerű ablakot jelenítenek meg a képernyőn. Az ablakot a következő utasítással igazíthatjuk középre.

Centre();

Az utasítás vízszintesen és függőlegesen is középre igazítja az ablakot.

IMPLEMENT_APP(MyApp)

Az alkalmazás kódjának makró mögé rejtése. Ezt a kódot másoljuk le és illesszük be, rendszerint nem kell vele foglalkoznunk.

A példa lefordításához futtassa a következő parancsot. (Unixon).

g++ main.cpp main.h simple.cpp simple.h  `wx-config --cxxflags --libs` -o simple

A fordítást Makefile segítségével könnyebb:

Makefile
main: 
	g++ main.cpp main.h simple.cpp simple.h  `wx-config --cxxflags --libs` -o simple

Egy alkalmazás ikon megjelenítése

Ebben a példában egy ikont teszünk az alkalmazásunkba. Egy kis ikon fog megjelenni az ablak bal-felső sarkában. Az ikon a program grafikus azonosítója.

icon.h
#include <wx/wx.h>
class Icon : public wxFrame
{
  public:
      Icon(const wxString& title);
 
};
icon.cpp
#include "icon.h"
 
Icon::Icon(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
    SetIcon(wxIcon(wxT("web.xpm")));
    Centre();
}
main.h
#include <wx/wx.h>
 
class MyApp : public wxApp
{
    public:
      virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "icon.h"
 
IMPLEMENT_APP(MyApp)
 
bool MyApp::OnInit()
{
      Icon *icon = new Icon(wxT("Icon"));
      icon->Show(true);
 
      return true;
}

A példánkban egy kis webikont használunk.

SetIcon(wxIcon(wxT("web.xpm")));

Egy alkalmazásikon megjelenítéséhez egyetlen kódsort használunk. Az XPM (X PixMap) egy ASCII képformátum.

Egy egyszerű gomb

A következő példában, készítünk egy gombot az frame widgeten. Látni fogjuk milyen egyszerű az esemény kezelése.

button.h
#include <wx/wx.h>
 
class Button : public wxFrame
{
public:
    Button(const wxString& title);
 
    void OnQuit(wxCommandEvent & event);
};
button.cpp
#include "button.h"
 
Button::Button(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(270, 150))
{
  wxPanel *panel = new wxPanel(this, wxID_ANY);
 
  wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"), 
      wxPoint(20, 20));
  Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, 
      wxCommandEventHandler(Button::OnQuit));
  button->SetFocus();
  Centre();
}
 
void Button::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 "button.h"
 
IMPLEMENT_APP(MyApp)
 
bool MyApp::OnInit()
{
 
    Button *btnapp = new Button(wxT("Button"));
    btnapp->Show(true);
 
    return true;
}
wxPanel *panel = new wxPanel(this, wxID_ANY);

Elsőnek készítünk egy wxPanel widgetet. Ez a wxFrame widgetsen belül fog elhelyezkedni.

wxButton *button = new wxButton(panel, wxID_EXIT, wxT("Quit"), wxPoint(20, 20));

Készítünk egy wxButton widgetet. Ennek helye a panelon lesz. Az előre definiált wxID_EXIT-et használjuk a gomb számára. Ez megjelenít egy kis kilépésikont a gombunkon. A gomb cimkéje „Quit” lesz. A gombot kézzel pozícionáljuk a x=20, y=20 koordinátákra. A koordináta rendszer kezdete a bal-felső sarokban van.

Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, 
      wxCommandEventHandler(Button::OnQuit));

Ha kattintunk a gombon, egy wxEVT_COMMAND_BUTTON_CLICKED esemény következik be. Az eseményhez a Button osztály OnQuit() metódusásval kapcsolódunk. Így amikor kattintunk a gombra, meghívódik az OnQuit metódus.

button->SetFocus();

Beállítjuk a billentyűzetfókuszt a gombra. Így ha megnyomjuk az Enter billentyűt, akkor elkezdődik a clicked.

Close(true);

Az OnQuit() metódusban, meghívjuk a Close() metódust. Ez megszakítja a program futását.

Widgets (komponens) kommunikáció

Fontos, hogy tudd a widgetek hogyan kommunikálnak az alkalmazással. Nézzük a következő példát.

Panels.h
#include <wx/wx.h>
#include <wx/panel.h>
 
class LeftPanel : public wxPanel
{
  public:
      LeftPanel(wxPanel *parent);
 
      void OnPlus(wxCommandEvent & event);
      void OnMinus(wxCommandEvent & event);
 
      wxButton *m_plus;
      wxButton *m_minus;
      wxPanel *m_parent;
      int count;
 
};
 
class RightPanel : public wxPanel
{
  public:
      RightPanel(wxPanel *parent);
 
      void OnSetText(wxCommandEvent & event);
 
      wxStaticText *m_text;
 
};
 
const int ID_PLUS = 101;
const int ID_MINUS = 102;
Panels.cpp
#include <wx/stattext.h>
#include "Communicate.h"
 
LeftPanel::LeftPanel(wxPanel * parent)
         : wxPanel(parent, -1, wxPoint(-1, -1), wxSize(-1, -1), wxBORDER_SUNKEN)
{
    count = 0;
    m_parent = parent;
    m_plus = new wxButton(this, ID_PLUS, wxT("+"), 
        wxPoint(10, 10));
    m_minus = new wxButton(this, ID_MINUS, wxT("-"), 
        wxPoint(10, 60));
    Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED, 
        wxCommandEventHandler(LeftPanel::OnPlus));
    Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED, 
        wxCommandEventHandler(LeftPanel::OnMinus));
}
 
void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
{
    count++;
 
    Communicate *comm = (Communicate *) m_parent->GetParent();
    comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
}
 
void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event))
{
    count--;
 
    Communicate *comm = (Communicate *) m_parent->GetParent();
    comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));
}
 
 
RightPanel::RightPanel(wxPanel * parent)
         : wxPanel(parent, wxID_ANY, wxDefaultPosition, 
           wxSize(270, 150), wxBORDER_SUNKEN)
{ 
      m_text = new wxStaticText(this, -1, wxT("0"), wxPoint(40, 60));
}
Communicate.h
#include "Panels.h"
#include <wx/wxprec.h>
 
 
class Communicate : public wxFrame
{
  public:
      Communicate(const wxString& title);
 
 
      LeftPanel *m_lp;
      RightPanel *m_rp;
      wxPanel *m_parent;
 
};
Communicate.cpp
#include "Communicate.h"
 
Communicate::Communicate(const wxString& title)
       : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(290, 150))
{
    m_parent = new wxPanel(this, wxID_ANY);
 
    wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
 
    m_lp = new LeftPanel(m_parent);
    m_rp = new RightPanel(m_parent);
 
    hbox->Add(m_lp, 1, wxEXPAND | wxALL, 5);
    hbox->Add(m_rp, 1, wxEXPAND | wxALL, 5);
 
    m_parent->SetSizer(hbox);
 
    this->Centre();
}
main.h
#include <wx/wx.h>
 
class MyApp : public wxApp
{
    public:
      virtual bool OnInit();
};
main.cpp
#include "main.h"
#include "Communicate.h"
 
IMPLEMENT_APP(MyApp)
 
bool MyApp::OnInit()
{
 
      Communicate *communicate = new Communicate(wxT("Widgets communicate"));
      communicate->Show(true);
 
      return true;
}

A példánkban van egy panel, egy bal és a jobb panel. A baloldali panelon van két gomb. A jobboldali panelon van egy statikus szöveg. A gombok megváltoztatják a statikus szöveget. A kérdés az, hogyan kapjuk meg a statikus szöveg mutatóját?

m_parent = parent;

Itt elmentjük a LeftPanel widget szülőjének mutatóját. Az egy wxPanel widget.

Communicate *comm = (Communicate *) m_parent->GetParent();
comm->m_rp->m_text->SetLabel(wxString::Format(wxT("%d"), count));

Ez a két sor nagyon fontos a példánkban. Láthatjuk, hogyan férhetünk hozzá a static text widgetshez, amely egy másik panelen van. Először vesszük mindkét panel szülőjét. Ennek a szülőpanelnek van egy mutatója a jobb panelre. A jobboldali panelnek meg van egy mutatója a static textre.