[[oktatas:programozás:wxWidgets|< wxWidgets]]
====== wxWidgets ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2013
* [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]]
* Web: http://szit.hu
===== Ablak igazítása =====
CenterOnParent();
CentreOnParent();
CenterOnScreen();
CentreOnScreen();
Centre();
Center();
SetTitle(_("Az ablak címe"));
===== Combobox =====
s = _("empty");
ComboBox1->Append(s);
Valamely részét törli. :)
ComboBox1->Clear();
===== ListBox =====
==== Hozzáfűzés ====
ListBox1->Append(wxT("Valami"));
==== Lista törlése ====
ListBox1->Clear();
==== Rendezés ====
A wxListBox osztályhoz nincs rendezőmetódus, viszont be lehet állítani, hogy rendezett legyen a lista. Ez a tulajdonság viszont bugos a 2.8.x wxWidgets verzióval (Debian GNU/Linux 6.0), így ne használjuk, mert nem lesz megfelelő a rendezettség.
A listát tegyük egy wxArrayString tömbbe, ott rendezzük és tegyük vissza:
wxArrayString templist;
for(int i=0; i< ListBox1->GetCount();i++)
templist.Add(ListBox1->GetString(i));
templist.Sort();
ListBox1->Clear();
for(int i=0; i< templist.GetCount();i++)
ListBox1->Append(templist[i]);
Vagy írjunk egy rendezőalgoritmust a lista elemeire magunk.
==== Lista adott számú eleme ====
wxString s = ListBox1->GetString(index);
Az index annak az elemnek a száma, amit szeretnénk megkapni.
==== Keresés a listában ====
if(ListBox1->FindString(wxT("alma")) == wxNOT_FOUND)
//Ami történjen, ha nincs alma a listában
==== Szelekció lekérése ====
Lekérdezzük:
wxString str = ListBox1->GetStringSelection();
==== Szelekció módosítása ====
ListBox1->SetString(ListBox1->GetSelection(), _("szöveg");
Figyelem! A SetStringSelection() metódust is erre találták ki,
de valamikor minden ok nélkül nem működik. Biztos bugos:
ListBox1->SetStringSelection(_("szöveg");
==== Szelekció törlése ====
ReceiptsListBox->Delete(ReceiptsListBox->GetSelection());
==== Engedélyezés ====
A használat engedélyezése, vagy tiltása:
ListBox1->Enable(false);
===== StaticText =====
Font beállítás:
wxFont font;
font.SetPointSize(18);
statictext1->SetFont(font);
Színbeállítás 1:
wxColour szin = wxColour(0, 0, 255);
statictext1->SetForegroundColour(szin);
Színbeállítás 2:
statictext1->SetForegroundColour(wxColour(255,0,0));
Érték beállítása:
statictext1->SetLabel(wxT("alma"));
===== TextCtrl =====
Egy TextCtrl panelra illesztése az objektum létrehozásával:
wxTextCtrl *szovegdoboz = new wxTextCtrl(panel, wxID_ANY, wxT(""), wxPoint(100,100));
Így is beállíthatjuk:
wxTextCtrl *szovegdoboz = new wxTextCtrl(panel, wxID_ANY);
Méret beállítása:
szovegdoboz->SetSize(200, 200);
Háttérszín beállítása:
szovegdoboz->SetBackgroundColour(wxColour(255,0,0));
Előtér, vagyis szöveg színe:
szovegdoboz->SetForgroundColour(wxColour(0,0,255));
Stílusok beállítása (wxTE_MULTILINE):
szovegdobooz = new wxTextCtrl(panel, wxID_ANY, wxT(""),
wxPoint(100,100), wxDefaultSize, wxTE_MULTILINE);
Több stílust is beállíthatunk a | karakterrel:
wxTE_MULTILINE|wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB
Érték beállítása
TextCtrl1->SetValue(wxT("Tartalom"));
Ha a tabulátor billentyűvel szeretnénk a következő kontrollra lépni, akkor egy Panelra kell helyezni a kontrollokat. Frame-en nem működik.
===== ListCtrl =====
wxListCtrl *kontroll;
kontroll = new wxListCtrl(panel, ID_KONTROLL, wxPoint(200,300),
wxDefaultSize, NULL, wxDefaultValidator, _T(""));
kontroll = new wxListCtrl(panel, wxID_ANY, wxPoint(200,300),
wxDefaultSize, wxSIMPLE_BORDER);
Háttérszín beállítása
kontroll->SetBackgroundColour(wxColour(255,0,0));
===== Konvertálás =====
A szöveg számokat tartalmaz és ezzel szeretnénk dolgozni.
==== wxString -> long ====
wxString szoveg = wxT("243");
long szam;
szoveg.ToLong(&szam);
==== wxString -> double ====
wxString strszam = wxT("53.422");
double szam;
strszam.ToDouble(&szam);
==== int -> wxString ====
wxString szoveg;
int szam = 3;
szoveg = wxString::Format(_T("%d"), szam);
==== Link ====
* http://wiki.wxwidgets.org/Converting_everything_to_and_from_wxString
===== Fájlkezelés =====
==== Fejléc ====
#include
==== Fájl megnyitása 1 ====
wxString FilePath = _T("adat.txt");
wxTextFile f(FilePath);
if(!f.Exists())
{
wxMessageBox(wxT("A fájl nem létezik"), wxT("Exist file"));
}
else
{
f.Open();
f.AddLine(_T("----------"), wxTextFileType_Unix);
f.Write();
f.Close();
}
==== Fájl megnyitása 2 ====
wxString FilePath = _T("adat.txt");
wxTextFile f;
f.Open(FilePath);
f.AddLine(_T("----------"), wxTextFileType_Unix);
f.Write();
f.Close();
Ebben a verzióban a megnyitáskor adjuk meg, milyen állományt szeretnénk megnyitni.
Így viszont nem tudjuk ellenőrizni, hogy a fájl létezik-e.
==== Olvasás a fájl végétől az elejéig ====
wxTextFile f(MachineFilePath);
wxString sz, sz2, sz3;
f.Open();
wxString FirstLine = f.GetFirstLine();
if(!FirstLine.IsEmpty())
{
for ( sz = f.GetLastLine();f.GetCurrentLine() > 0;sz = f.GetPrevLine() )
{
...
}
}
==== Fájl végéhez fűzés ====
wxString FilePath = _T("adat.txt");
wxTextFile f(FilePath);
if(!f.Exists())
{
wxMessageBox(wxT("A fájl nem létezik"), wxT("Exist file"));
}
else
{
f.Open();
f.Open(FilePath);
f.AddLine(_T("----------"), wxTextFileType_Unix);
f.Write();
f.Close();
}
==== Fájl tartalmának törlése ====
f.Clear();
f.Write();
==== Fájl létrehozása ====
wxString FilePath = _T("adat.txt");
wxTextFile f(FilePath);
f.Create(FilePath);
==== Olvasás a fájl elejétől a végéig ====
wxString row;
wxString FilePath = _T("adat.txt");
wxTextFile f(FilePath);
if(!f.Exists())
{
wxMessageBox(_("A fájl nemlétezik!"), _("Fájl létezésének ellenőrzése"));
return;
}
else
{
f.Open();
for ( row = f.GetFirstLine(); !f.Eof(); row = f.GetNextLine() )
{
// Csinálunk valamit a row-val
}
f.Close();
}
===== Könyvtárkezelés =====
==== Könyvtár létezésének ellenőrzése ====
if(!wxDirExists(_T("könyvtárútvonal")))
//Amit teszünk ha nemlétezik
Így is lehet
wxString dirpath(_T("valahol/valami"));
wxDir dir;
if(dir.Exists(dirpath))
//Amit teszünk ha nem létezik
==== Könyvtár létrehozása ====
wxMkdir(_T("konyvtarnev"), 0770);
===== Program ikon =====
==== Fejléc ====
#include
#include
#include
==== Példa ====
Programikon betöltése:
wxString IconDir = _T("/usr/share/programnev/");
wxIcon FrameIcon;
wxString IconPath = IconDir + _T("programikon.png");
FrameIcon.CopyFromBitmap(wxBitmap(wxImage(IconPath)));
SetIcon(FrameIcon);
==== Programba épített xpm ====
// the application icon
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
// #include "res/eidviewer.xpm"
static char *eidviewer_xpm[] = {
"32 32 5 1",
" c None",
"a c Black",
"b c #FF0000",
"c c #FFFF00",
"d c #800000",
/* pixels */
" d ",
" ddddd ",
" dd ddddddd ",
" dddddddddddddddddddddd ",
" dddddddddddddddddddddddd ",
"ddddddddddddddddddddddddddd ",
"ddddddddddddddddddddddddddd ",
"dddddddddddddddddddddddddd ",
"ddddddddddddddddacccacdddd ",
" ddddddddddddddcacccaaadddd ",
" dd ddddddddddccaccaccddddd ",
" ddddddddddcaaaaaacddddddd ",
" dddddddddacaccacadddddd ",
" ddddddddcaccacddddddddd ",
" dddddddddddddddddddddd ",
" ddddddddddddddddddd ",
" ddddddddddddddddd ",
" dddddddddddddddd ",
" ddddddddddddddd ",
" dddd dddddddddd ",
" ddd dddddddddd ",
" dddddddddd ",
" ddddddddddd ",
" dddddddddd ",
"aaaaccccbbbb dddddd ",
"aaaaccccbbbb ddddd ",
"aaaaccccbbbb ddd ",
"aaaaccccbbbb ",
"aaaaccccbbbb ",
"aaaaccccbbbb ",
"aaaaccccbbbb ",
"aaaaccccbbbb "};
#endif
==== Másik példa ====
//================= Icon ===========
wxString IconFilePath;
wxString ExecutablePath;
wxStandardPaths Paths;
ExecutablePath = Paths.GetExecutablePath();
wxRegEx* regex = new wxRegEx(_T("/[a-z]*$"), wxRE_ADVANCED);
regex->Replace(&ExecutablePath, _T(""));
IconFilePath = ExecutablePath + _T("/") + _T("icons/gnumerology.xpm");
if( !wxFile::Exists(IconFilePath) )
IconFilePath = _T("icons/gnumerology.xpm");
if( !wxFile::Exists(IconFilePath) )
IconFilePath = _T("gnumerology.xpm");
#ifndef __WXMSW__
if( !wxFile::Exists(IconFilePath) )
IconFilePath = _T("/usr/share/gnumerology/icons/gnumerology.xpm");
if( !wxFile::Exists(IconFilePath) )
IconFilePath = _T("/usr/local/gnumerology/icons/gnumerology.xpm");
#endif //__WXMSW__
wxIcon FrameIcon;
FrameIcon.CopyFromBitmap(wxBitmap(wxImage(IconFilePath)));
SetIcon(FrameIcon);
//================= End of Icon ===========
===== wxFileDialog =====
Fájl párbeszédablakok
==== Fejlécfájl ====
#include
==== Osztály ====
wxFileDialog osztályt használjuk. A konstruktorban egy minimális paramétert szoktunk használni, amely megadja a szülőobjektumot. Ez általában this.
==== Példa ====
wxFileDialog *BrowseFileDialog = new wxFileDialog(this);
BrowseFileDialog->ShowModal();
if(BrowseFileDialog->ShowModal() != wxID_OK)
return;
TextCtrl1->SetValue(BrowseFileDialog->GetFilename());
wxFileDialog *filedialog = new wxFileDialog(this, _("Choose a file"), _("/default/directory"), _("defaultfile"), _("*.*"), wxFD_DEFAULT_STYLE);
filedialog->ShowModal();
A wxFD_DEFAULT_STYLE állandó helyére behelyettesíthetők más azonosítók is. Lásd alább.
==== Állandók ====
| wxFD_DEFAULT_STYLE | Megegyezik a wxFD_OPEN állandóval |
| wxFD_OPEN | Megnyitás párbeszédablak Nem kombinálható a wxFD_SAVE állandóval. |
| wxFD_SAVE | Mentés párbeszédablak. Nem kombinálható a wxFD_OPEN állandóval. |
| wxFD_OVERWRITE_PROMPT | Csak mentés. A fájl felülírásra rákérdez |
| wxFD_FILE_MUST_EXIST | Megnyitás csak. Csak kész fájl kiválasztása |
| wxFD_MULTIPLE | Csak megnyitás. Több fájl kiválasztása is megengedett |
| wxFD_CHANGE_DIR | Az aktuális könyvtár cseréje arra, ahol a kiválasztott fájl található. |
| wxFD_PREVIEW | A kiválasztott fájlok előnézetét adja (jelenleg csak a wxGTK támogatja a GTK+ 2.4 és későbbi változatában). |
==== Teljes konstruktor ====
wxFileDialog *a = new wxFileDialog(this, _("Choose a file"), _("/default/directory"), _("defaultfile"), _("*.*"), wxFD_DEFAULT_STYLE, wxDefaultPosition, wxDefaultSize, _("filedlg"));
===== wxDirDialog =====
Könyvtár párbeszédablak használata
==== Fejlécfájl ====
#include
==== Példa ====
wxDirDialog *BrowseDirDialog = new wxDirDialog(this);
if(BrowseDirDialog->ShowModal() == wxID_OK)
DataSavePathTextCtrl->SetValue(BrowseDirDialog->GetPath());
===== Státuszsor =====
A státuszsor szövegének beállítása:
StatusBar1->SetStatusText(_wxT("státusz szöveg"));
Ha több mezőből áll:
StatusBar1->SetStatusText(_wxT("első"), 0);
StatusBar1->SetStatusText(_wxT("második"), 1);
===== Reguláris kifejezések =====
==== Fejlécállomány ====
#include
...
wxString vs = _T("^([[.a.]-[.z.]]|[[.A.]-[.Z.]])+$");
wxRegEx* GoodName = new wxRegEx(vs);
if(!GoodName->Matches(FamilyName)) wxMessageBox(wxT("Az e-mail címed"));
Lehet így is:
wxString vs = _T("^([[.a.]-[.z.]]|[[.A.]-[.Z.]]|-|_)+$");
Ekkor a kötőjelre és az alulvonásra is illeszkedik.
==== HTML tagek kiszedése ====
A HTML tagek kiszedése egy webforrásból:
wxRegEx* regex = new wxRegEx(wxT("<.*?>"), wxRE_ADVANCED);
size_t count = regex->ReplaceAll(&htmldata, wxT(""));
Ha egy \. akarunk a reguláris kifejezésbe illeszteni, két vissza-perjel kell,
mert a C++ a vissza-perjelnek egyébként is speciális jelentése van:
wxRegEx* regex = new wxRegEx(wxT("\\."), wxRE_ADVANCED);
==== Ha újra szeretnénk felhasználni a regex változót ====
wxString regstr;
wxRegEx* regex = new wxRegEx();
regstr = _T("^1|4|8$");
regex->Compile(regstr);
if(regex->Matches(_T("amit_ellenőrizni_kell")))
//Amit tenni akarunk ha egyezés van
===== Unicode használat =====
Nem csak wxWidget esetén lehet hasznos az UNICODE definiálása
#define UNICODE
Mindig az #include sorok előtt legyenek.
===== Táblázat -- wxGrid =====
==== Alapbeállíátsok ====
Oszlop címke beállítása (0-dik):
Grid1->SetColLabelValue(0, wxT("alma"));
Sor és oszlopcímkék elrejtése:
Grid1->SetRowLabelSize(0);
Grid1->SetColLabelSize(0);
Sorok és oszlopok száma:
Grid1->CreateGrid(9,9);
Szélesség, magasság állítása:
//Grid1->SetRowLabelSize(10); //Oldalt
Grid1->SetColLabelSize(50); //felül
Grid1->SetDefaultColSize(30, true ); //oszlopok szélessége
Grid1->SetColLabelTextOrientation(wxVERTICAL); //wxHORIZONTAL Ez az alapértelmezett
Cellafelirat beállítása
Grid1->SetColLabelValue(0, _T("Valami"));
Grid1->SetRowLabelValue(1, _T("MásValami"));
Sorok hozzáadása:
Grid1->AppendRows(1,true);
Oszlopok hozzáadása:
Grid1->AppendCols(1,true);
AppendCols(int numCols = 1, bool updateLabels = TRUE)
AppendRows(int numRows = 1, bool updateLabels = TRUE)
ClearGrid()
DeleteCols(int pos = 0, int numCols = 1, bool updateLabels = TRUE)
DeleteRows(int pos = 0, int numRows = 1, bool updateLabels = TRUE)
GetNumberCols( )
GetNumberRows( )
InsertCols(int pos = 0, int numCols = 1, bool updateLabels = TRUE)
InsertRows(int pos = 0, int numRows = 1, bool updateLabels = TRUE)
=== Színezés ===
Grid2->SetCellBackgroundColour(5, 10, wxColour(0, 0, 255)); //y, x, szín
=== Igazítás ===
wxGrid::SetDefaultCellAlignment
void SetDefaultCellAlignment(int horiz, int vert)
Alapértelmezett vízszintes és függőleges igazítás a cellák szövegei számára.
Vízszintesen a következő értékeke egyike: wxALIGN_LEFT, wxALIGN_CENTRE vagy wxALIGN_RIGHT.
Függőlegesen a következő értékek egyike: wxALIGN_TOP, wxALIGN_CENTRE vagy wxALIGN_BOTTOM.
=== Font ===
wxGrid::SetDefaultCellFont
void SetDefaultCellFont(const wxFont& font)
Alapértelmezett font a szöveg számára a táblázatban.
=== Egyéb ===
Grid2->CreateGrid(16,16); //A táblázat cellái
Grid2->SetRowLabelSize(0); //Nincs oldalcímke
Grid2->SetColLabelSize(0); //Nincs felsőcímke
Grid2->SetDefaultColSize(20); //Az oszlopok szélessége
Grid2->SetDefaultRowSize(20); //A sorok magassága
Grid2->SetSize(350, 350); //Táblázat szélessége, magassága
Grid2->SetCellBackgroundColour(5, 10, wxColour(0, 0, 255)); //y, x, szín
Grid2->SetCellTextColour(5, 10, wxColour(255,255,255)); //Szöveg színe
Grid2->SetCellAlignment(wxALIGN_CENTRE, 5, 10); //Igazítás
Grid2->SetCellValue(5, 10, _("X")); //Tartalom
Grid2->SetGridLineColour(wxColour(0,0,0)); //Szegély színe
wxFont font;
font.SetPointSize(18);
Grid2->SetDefaultCellFont(font);
A felső és bal szegély nem látszik, ezért alá szokás tenni egy wxPenel objektumot.
==== Cellaszerkesztők ====
=== Legördülő listadoboz ===
wxString strChoices[3] = {_("one"), _("two"), _("three")};
Grid1->SetCellEditor(1, 1, new wxGridCellChoiceEditor(3, strChoices, true));
=== Léptetődoboz ===
Grid1->SetCellEditor(1, 1, new wxGridCellNumberEditor(1,1000));
=== Jelőlőnégyzet ===
Grid1->SetCellEditor(1, 1, new wxGridCellBoolEditor());
=== Törtszám ===
Grid1->SetCellEditor(1, 1, new wxGridCellFloatEditor());
==== Kép a cellába ====
class wxBmpCellRenderer : public wxGridCellRenderer {
public:
wxBmpCellRenderer(const wxBitmap& bmp) : wxGridCellRenderer(), m_bmp(bmp) {}
void Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
const wxRect& rect, int row, int col, bool isSelected);
wxSize GetBestSize(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc,
int row, int col) { return wxSize(m_bmp.GetWidth(), m_bmp.GetHeight()); }
wxGridCellRenderer *Clone() const { return new wxBmpCellRenderer(m_bmp); }
private:
wxBitmap m_bmp;
};
void wxBmpCellRenderer::Draw(wxGrid& grid, wxGridCellAttr& attr, wxDC& dc, const wxRect& rect, int row, int col, bool isSelected)
{
//wxColour BgColor = attr.GetBackgroundColour();
wxColour BgColor = wxColour(255,0,0);
dc.SetBrush(wxBrush(BgColor, wxSOLID));
//dc.SetPen(*wxTRANSPARENT_PEN);
dc.DrawRectangle(rect.x, rect.y, rect.width, rect.height);
//dc.DrawRectangle(2, 2, 10, 15);
}
wxString IconPath = _T("kepfajl.xpm");
Grid1->SetCellRenderer(1, 1, new wxBmpCellRenderer(wxBitmap(wxImage(IconPath))));
===== Üzenet ablak =====
==== Egyszerű üzenetablak ====
wxMessageBox(wxT("Üzenet"));
==== Szükséges könyvtárak ====
#include
==== Lehetséges használat ====
int answer = wxMessageBox("Quit program?", "Confirm",
wxYES_NO | wxCANCEL, main_frame);
if (answer == wxYES)
main_frame->Close();
A wxMessageBox utolsó paramétere nem kötelező.
==== Másik lehetséges használat ====
if(wxMessageBox(_("The file is exist! Append?"), _("Exist file"),wxYES_NO)!=wxYES)
return;
===== Szöveg darabolása =====
#include
wxStringTokenizer tkz(wxT("alma:körte:barack:szilva"), wxT(":"));
while ( tkz.HasMoreTokens() )
{
wxString token = tkz.GetNextToken();
// Amit szeretnénk csinálni a szóval (tokennel)
}
A token változóban megkapjuk az egyes szöveg részeket, úgy mint alma, kört, stb.
Szeparátor megadható több is, egymás után:
wxStringTokenizer tkz(wxT("alma:körte:barack:szilva"), wxT(":;\t\n"));
A példában kettőspont, pontosvessző, tabulátor és sortörés is szeparátor.
===== wxAboutDialogInfo =====
#include
wxAboutDialogInfo a;
a.AddDeveloper(_T("Sallai András"));
a.SetCopyright(_T("Copyright (c) Sallai András, 2011"));
a.SetLicence(_T("GNU GPL v.3"));
a.SetVersion(_T("0.1"));
a.SetWebSite(_T("http://szit.hu"));
wxAboutBox(a);
===== Konfiguráció =====
==== Fejléc ====
#include
==== Beállítások mentése ====
wxConfig *config = new wxConfig(wxT("programnev"));
config->SetPath(wxT("CsoportNev"));
config->Write(wxT("Változó1"), wxT("érték"));
config->Write(wxT("Változó2"), wxT("érték"));
config->Flush();
delete config;
==== Beállítások betöltése ====
wxConfig *config = new wxConfig(wxT("programnev"));
config->SetPath(wxT("CsoportNev"));
wxString beallitas1 = config->Read(wxT("Valtozo1"));
wxString beallitas2 = config->Read(wxT("Valtozo2"));
config->Flush();
delete config;
==== Komplexebb példa ====
wxConfig *config = new wxConfig(wxT("gregistry"));
config->SetPath(wxT("MachinePosition"));
machinePosx << Machine01Panel->GetPosition().x;
machinePosy << Machine01Panel->GetPosition().y;
machinePos.Append(machinePosx);
machinePos.Append(_T("x"));
machinePos.Append(machinePosy);
config->Write(wxT("Machine01"), machinePos);
machinePos.Clear();
machinePosx.Clear();
machinePosy.Clear();
machinePosx << Machine02Panel->GetPosition().x;
machinePosy << Machine02Panel->GetPosition().y;
machinePos.Append(machinePosx);
machinePos.Append(_T("x"));
machinePos.Append(machinePosy);
config->Write(wxT("Machine02"), machinePos);
config->Flush();
delete config;
==== Programneven könyvtárba mentés ====
wxConfig *config = new wxConfig(wxT("programnev/config"));
===== Eseménykezelés =====
==== Komponenshez esemény ====
ComboBox2->Connect(wxEVT_LEFT_DOWN,wxMouseEventHandler(aFrame::ComboBox2OnMotion), NULL, this);
Értelmezés:
* A ComboBox2 komponens egy eseményét szeretném figyelni.
* Az egér LEFT_DOWN eseményére szeretnék reagálni
* Ha az esemény bekövetkezik akkor a következő metódus hajtódjon végre: aFrame::ComboBox2OnMotion
* Az eseménytáblában nincsenek adatok
* A metódust this (ez az osztály hívja)
==== Eseménykezelő metódus ====
void gregistryFrame::OnMotion(wxMouseEvent& event)
{
if(event.LeftIsDown())
{
//Mi történjen, ha a bal egérgomb le volt nyomva.
}
}
Az event objektumon keresztül lekérdezhetjük az egér aktuális állapotát:
int x = event.GetX();
int y = event.GetY();
==== Melyik objektum váltotta ki az eseményt? ====
Az eseménykezelő metódusban:
if(event.GetEventObject() == ComboBox1)
wxMessageBox(wxT("A ComboBox1 váltott ki az eseményt"));
===== Másik Frame =====
==== Hivatkozás a másik framre ====
Sokszor szeretnénk másik Framet készíteni. Például egy beállítás frame. Legyen a főprogramunk ProgramFrame a beállítások a OptionsFrame osztályban.
Az OptionsFrame megjelenítését a következő módon érhetem el:
OptionsFrame *optionsframe = new OptionsFrame(this, 0);
optionsframe->Show();
Fontos a szülőparaméter beállítása: this. Az első sort ne a megjelenítést végző metódusba tegyük, mert akkor minden megjelenítés eseménynél létrejön. Tegyük az osztály egyik tagjának, amit a konstruktorban hozunk létre.
A ProgramFrame fejrészében természetesen kell egy include:
#include "OptionsFrame.h"
==== Visszafele hivatkozás ====
Általában szeretnénk a másik frame-ből visszafele is hivatkozni, a hívó frame egyes objektumaira.
ProgramFrame *programframe = (ProgramFrame *) this->GetParent();
Ezek után meghívhatjuk a ProgramFrame osztály metódusait, ha azok publikusak:
programframe->SetProgramFrameObject(SomeParameter);
==== Billentyűzet figyelése ====
FamilynameTextCtrl->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(gnumerologyFrame::OnKeyDown), NULL, this);
void Board::OnKeyDown(wxKeyEvent& event)
{
if (!isStarted || curPiece.GetShape() == NoShape) {
event.Skip();
return;
}
int keycode = event.GetKeyCode();
if (keycode == 'p' || keycode == 'P') {
Pause();
return;
}
if (isPaused)
return;
switch (keycode) {
case WXK_LEFT:
TryMove(curPiece, curX - 1, curY);
break;
case WXK_RIGHT:
TryMove(curPiece, curX + 1, curY);
break;
case WXK_DOWN:
TryMove(curPiece.RotateRight(), curX, curY);
break;
case WXK_UP:
TryMove(curPiece.RotateLeft(), curX, curY);
break;
case WXK_SPACE:
DropDown();
break;
case 'd':
OneLineDown();
break;
case 'D':
OneLineDown();
break;
default:
event.Skip();
}
}
WXK_BACK = 8
WXK_TAB = 9
WXK_RETURN = 13
WXK_ESCAPE = 27
WXK_SPACE = 32
WXK_DELETE = 127
// Az alábbiak nem kompatibilisek a unicode karakterekkel.
// Ha key eseményből unicode karaktert szeretnél, akkor használt a következőt:
// wxKeyEvent::GetUnicodeKey
WXK_START = 300
WXK_LBUTTON
WXK_RBUTTON
WXK_CANCEL
WXK_MBUTTON
WXK_CLEAR
WXK_SHIFT
WXK_ALT
WXK_CONTROL
WXK_MENU
WXK_PAUSE
WXK_CAPITAL
WXK_END
WXK_HOME
WXK_LEFT
WXK_UP
WXK_RIGHT
WXK_DOWN
WXK_SELECT
WXK_PRINT
WXK_EXECUTE
WXK_SNAPSHOT
WXK_INSERT
WXK_HELP
WXK_NUMPAD0
WXK_NUMPAD1
WXK_NUMPAD2
WXK_NUMPAD3
WXK_NUMPAD4
WXK_NUMPAD5
WXK_NUMPAD6
WXK_NUMPAD7
WXK_NUMPAD8
WXK_NUMPAD9
WXK_MULTIPLY
WXK_ADD
WXK_SEPARATOR
WXK_SUBTRACT
WXK_DECIMAL
WXK_DIVIDE
WXK_F1
WXK_F2
WXK_F3
WXK_F4
WXK_F5
WXK_F6
WXK_F7
WXK_F8
WXK_F9
WXK_F10
WXK_F11
WXK_F12
WXK_F13
WXK_F14
WXK_F15
WXK_F16
WXK_F17
WXK_F18
WXK_F19
WXK_F20
WXK_F21
WXK_F22
WXK_F23
WXK_F24
WXK_NUMLOCK
WXK_SCROLL
WXK_PAGEUP,
WXK_PAGEDOWN,
WXK_NUMPAD_SPACE,
WXK_NUMPAD_TAB,
WXK_NUMPAD_ENTER,
WXK_NUMPAD_F1,
WXK_NUMPAD_F2,
WXK_NUMPAD_F3,
WXK_NUMPAD_F4,
WXK_NUMPAD_HOME,
WXK_NUMPAD_LEFT,
WXK_NUMPAD_UP,
WXK_NUMPAD_RIGHT,
WXK_NUMPAD_DOWN,
WXK_NUMPAD_PAGEUP,
WXK_NUMPAD_PAGEDOWN,
WXK_NUMPAD_END,
WXK_NUMPAD_BEGIN,
WXK_NUMPAD_INSERT,
WXK_NUMPAD_DELETE,
WXK_NUMPAD_EQUAL,
WXK_NUMPAD_MULTIPLY,
WXK_NUMPAD_ADD,
WXK_NUMPAD_SEPARATOR,
WXK_NUMPAD_SUBTRACT,
WXK_NUMPAD_DECIMAL,
WXK_NUMPAD_DIVIDE,
===== Dátum =====
==== Az aktuális nap lekérdezése ====
wxDateTime now = wxDateTime::Now();
wxString CurrentDay = now.Format(_T("%d"));
NumberOfDayDayComboBox->SetValue(CurrentDay);
===== Színek =====
==== Fejlécfájl ====
#include
==== Színek előállítása RGB kódokkal ====
wxColour(255,0,0)
===== Külső program futtatása =====
wxString s = _T("espeak -ven ") + Word;
char str[100];
strcpy(str, s.mb_str().data());
system(str);
===== Tömb =====
==== wxArray ====
Ez a fejlécállomány kell:
??
A fejlécállományban definiáljuk a tömböt:
WX_DEFINE_ARRAY_INT(int, TIntTomb);
TIntTomb *tomb;
Helyet foglalunk:
tomb = new TIntTomb;
Egy számot a tömbbe teszünk:
tomb->Add(35);
==== wxArrayString ====
wxArrayString *gyumolcsok = new wxArrayString();
gyumolcsok->Add(wxT("alma"));
gyumolcsok->Add(wxT("körte"));
gyumolcsok->Add(wxT("barack"));
gyumolcsok->Add(wxT("szilva"));
wxString str = gyumolcsok->Item(0); //az "alma"-át adja eredményül
===== TrayIcon =====
==== Fejléc ====
#include
==== Példa ====
wxTaskBarIcon osztályt használjuk
taskbaricon->SetIcon(ikonvaltozo);
taskbaricon->PopupMenu(menu);
taskbaricon->RemoveIcon()
// Felülírható:
wxMenu *MyTaskBarIcon::CreatePopupMenu()
{
// Try creating menus different ways
// TODO: Probably try calling SetBitmap with some XPMs here
wxMenu *menu = new wxMenu;
menu->Append(PU_RESTORE, _T("&Restore TBTest"));
menu->AppendSeparator();
menu->Append(PU_OLD_ICON, _T("&Restore Old Icon"));
menu->Append(PU_NEW_ICON, _T("&Set New Icon"));
menu->AppendSeparator();
menu->Append(PU_CHECKMARK, _T("Checkmark"),wxT(""), wxITEM_CHECK);
menu->AppendSeparator();
wxMenu *submenu = new wxMenu;
submenu->Append(PU_SUB1, _T("One submenu"));
submenu->AppendSeparator();
submenu->Append(PU_SUB2, _T("Another submenu"));
menu->Append(PU_SUBMAIN, _T("Submenu"), submenu);
#ifndef __WXMAC_OSX__ /*Mac has built-in quit menu*/
menu->AppendSeparator();
menu->Append(PU_EXIT, _T("E&xit"));
#endif
return menu;
}
==== Példalinkek ====
* http://freenet.googlecode.com/svn/trunk/apps/wxFCP/demo/SysTray/systray.cpp
* http://freenet.googlecode.com/svn/trunk/apps/wxFCP/demo/SysTray/systray.h
* http://code.google.com/p/daodict/source/browse/trunk/daodict/src/daodict/taskbaricon.cpp
* http://code.google.com/p/daodict/source/browse/trunk/daodict/src/daodict/taskbaricon.h
===== Környezet vizsgálata =====
==== Példa 1 ====
#ifdef __WXMSW__
//Ha Windowsos környezet
#elif __WXGTK__
//Ha GTK környezet
#else
//Ha egyik sem
#endif // __WXMSW__
==== Példa 2 ====
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
#include "logo_connected.xpm"
#endif
==== Példa 3 ====
#ifndef __WXMAC_OSX__ /*A Mac elkészíti a quit menüben. */
menu->AppendSeparator();
menu->Append(PU_EXIT, _T("E&xit"));
#endif
===== Nemzetköziesítés =====
==== Forrásfájlban ====
wxMessageBox(_("Üzenet"));
==== A fordítandó fájlok kinyerése ====
xgettext -f sources.txt -p po -o programnev.pot -L C++ -k_
==== A fordítások megadása ====
A nemzetközíesítést a wxApp osztályból származtatott osztályban kell megvalósítani.
Az osztály fejlécállományában:
private:
wxLocale locale;
wxStandardPaths* paths = new wxStandardPaths;
wxString ExecutablePath = paths->GetExecutablePath();
wxString LocalePath;
wxDir d;
if(d.Exists(ExecutablePath + _T("/po")))
LocalePath = ExecutablePath + _T("/po");
locale.Init();
locale.AddCatalogLookupPathPrefix(LocalePath);
locale.AddCatalog(_T("programnev"));
locale.AddCatalog(_T("sregister"),wxLANGUAGE_HUNGARIAN,_T("UTF-8") );
==== Komplett példa ====
//Get execute Path
wxStandardPaths* paths = new wxStandardPaths;
wxString Path = paths->GetExecutablePath();
//Remove from right the filename
wxRegEx* regex = new wxRegEx(_T("/[a-z]*$"), wxRE_ADVANCED);
regex->Replace(&Path, _T(""));
locale.Init();
locale.AddCatalogLookupPathPrefix(_T("/usr/share/locale"));
locale.AddCatalogLookupPathPrefix(_T("/usr/local/gnumerology/share/locale"));
locale.AddCatalogLookupPathPrefix(Path);
locale.AddCatalogLookupPathPrefix(_T("po"));
//locale.AddCatalog(_T("gnumerology"),wxLANGUAGE_HUNGARIAN,_T("UTF-8") );
locale.AddCatalog(_T("gnumerology"));
==== Link ====
* http://wiki.wxwidgets.org/Internationalization
===== Standard útvonalak =====
==== Bevezetés ====
wxStandardPaths osztályt használjuk
#include
==== Melyik könyvtárból fut a program? ====
wxString ExecutablePath;
wxStandardPaths Paths;
ExecutablePath = Paths.GetExecutablePath();
wxRegEx* regex = new wxRegEx(_T("/[a-z]*$"), wxRE_ADVANCED);
regex->Replace(&ExecutablePath, _T(""));
==== Adatok legjobb helye ====
wxStandardPaths Paths;
wxString UserDataDir = Paths.GetUserDataDir();
==== Két operációs rendszeren a fájlnév eltávolítása====
wxRegEx* regex = new wxRegEx(_T("(/[a-z]*$)|(\\B[a-z]*\\.exe$)"), wxRE_ADVANCED);
regex->Replace(&ExecutablePath, _T(""));
===== Folyamatsáv =====
Osztály: wxGauge
gauge [UK: ɡeɪdʒ] mérték
==== Metódusok ====
void SetValue(int pos):
Gauge1->SetValue(50);
void SetRange(int range):
Guage1->SetRAnge(120);
int GetValue() const:
int a = Gauge1->GetValue();
Gauge1->SetValue(Gauge1->GetValue()+5);
int GetRange() const:
int a = Gauge1->GetRange();
void Pulse():
Gauge1->Pulse();
===== Léptető doboz =====
spin [UK: spɪn] [US: ˈspɪn] forgat
==== Metódusok ====
void SetValue(const wxString& text):
SpinCtrl1->SetValue(_("alma"));
void SetValue(int value):
SpinCtrl1->SetValue(5);
int GetValue() const:
int b = SpinCtrl1->GetValue();
void SetRange(int minVal, int maxVal):
SpinCtrl1->SetRange(5,10);
===== Temp könyvtár =====
#include
...
wxStandardPaths stdPath;
wxString tpath=stdPath.GetTempDir();
wxString tfpath;
tfpath.Append(tpath);
tfpath.Append(_("/scite_input"));
wxString = wxFileName::GetPathSeparator(wxPATH_NATIVE);
A wxPATH_NATIVE azt jelenti az adott rendszer aktuális szeparátorát szeretnénk.
Ezen kívül használhatók még a következő állandók:
* wxPATH_UNIX
* wxPATH_BEOS
* wxPATH_MAC
* wxPATH_DOS
* wxPATH_WIN
* wxPATH_OS2
* wxPATH_VMS
* wxPATH_MAX
A következő példában elkészültjük az adott rendszerben a fájlt, majd kiíratjuk a teljes útvonalat:
wxString tempDir = wxStandardPaths::Get().GetTempDir(); //Az adott rendszer temp könyvtára
tempDir.Append(wxFileName::GetPathSeparator(wxPATH_NATIVE)); //Az adott rendszer útvonal szeparátorát hozzáfűzzük
wxString path = wxFileName::CreateTempFileName(tempDir,(wxFFile*)NULL); //Elkészítjük a fájlt, majd eltároljuk a teljes útvonalat.
wxMessageBox(path);
===== Komponensek helye, mozgatása =====
Egy nyomógomb mozgatásai a 20, 20 helyre:
EgyButton->SetPosition(wxPoint(20,20));
A nyomógombot 3 pixellel jobbra mozdítjuk:
wxPoint pont = EgyButton->GetPosition();
pont.x = pont.x + 3;
EgyButton->SetPosition(pont);