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.
Először készítenünk kell egy alap wxWidgets programot.
#include <wx/wx.h> 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 <wx/wx.h> 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
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 <wx/wx.h> 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 <wx/wx.h> 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.
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 <wx/wx.h> 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 <wx/wx.h> 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.
Fontos, hogy tudd a widgetek hogyan kommunikálnak az alkalmazással. Nézzük a következő példát.
#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;
#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)); }
#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; };
#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 <wx/wx.h> 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.