Tartalomjegyzék
wxWidgets
- Szerző: Sallai András
- Copyright © Sallai András, 2013
- 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
Fájlkezelés
Fejléc
#include <wx/textfile.h>
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 <wx/icon.h> #include <wx/image.h> #include <wx/bitmap.h>
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 <wx/filedlg.h>
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 <wx/dirdlg.h>
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 <wx/regex.h>
...
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 <wx/msgdlg.h>
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 <wx/tokenzr.h>
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 <wx/aboutdlg.h>
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 <wx/config.h>
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 <wx/colour.h>
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 <wx/taskbar.h>
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
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
Standard útvonalak
Bevezetés
wxStandardPaths osztályt használjuk
#include <wx/stdpaths.h>
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 <wx/stdpaths.h> ... 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);