[[oktatas:programozás:wxwidgets:wxWidgets kézikönyv|< 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.
#include
class Simple : public wxFrame
{
public:
Simple(const wxString& title);
};
#include "simple.h"
Simple::Simple(const wxString& title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
Centre();
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#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:
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.
#include
class Icon : public wxFrame
{
public:
Icon(const wxString& title);
};
#include "icon.h"
Icon::Icon(const wxString& title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150))
{
SetIcon(wxIcon(wxT("web.xpm")));
Centre();
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#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.
#include
class Button : public wxFrame
{
public:
Button(const wxString& title);
void OnQuit(wxCommandEvent & event);
};
#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);
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#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.
#include
#include
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;
#include
#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));
}
#include "Panels.h"
#include
class Communicate : public wxFrame
{
public:
Communicate(const wxString& title);
LeftPanel *m_lp;
RightPanel *m_rp;
wxPanel *m_parent;
};
#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();
}
#include
class MyApp : public wxApp
{
public:
virtual bool OnInit();
};
#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.