Felhasználói eszközök

Eszközök a webhelyen


oktatas:programozas:wxwidgets:wxwidgets_mintak

Tartalomjegyzék

< wxWidgets

wxWidgets

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

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);
oktatas/programozas/wxwidgets/wxwidgets_mintak.txt · Utolsó módosítás: 2019/08/22 11:01 szerkesztette: admin