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