[[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);