Mikä on wxWidgets. Se on GUI kirjasto ikkunallisten ohjelmien luontiin. Se oli ennen wxWindows mutta Microsoft puuttui peliin... wxWidgets on hyvä koska se toimii (lähes) kaikissa järjestelmissä, kuten Linuxissa, Windowsissa ja Macintoshissa.
wxWidgetsistä on myös erittäin hyvä dokumentaatio http://www.wxwidgets.org/manuals/2.4.2/wx.htm
Version 2.5.3 dokumentaatio
http://www.wxwidgets.org/manuals/2.5.3/wx_contents.html
Dev-C++:aan voi wxWidgetsin asentaa DevPackin avulla.
http://koti.mbnet.fi/linkku-/wxWidgets253.DevPak
Seuraavaksi esimerkkiohjelma, jossa on richedit, jossa linkit muuttuvat sinisiksi ja kun hiiri menee linkin päälle niin tulee messageboxi, jossa lukee "url". Ohjelmassa on valikko josta ohjelman voi sulkea tai avata tiedoston, jonka sisältä näytetään richeditissä. Richedit toimii vain Windowsissa.
Tiedostojen tallennuksen saat kotiläksyksi :)
Windowsille käännetty .exe ja lähdekoodi löytyy pakattuna osoitteesta: http://koti.mbnet.fi/linkku-/wx2.zip
main.h
#ifndef MAIN_H #define MAIN_H #include <wx/wx.h> // tiedostojen käsittelyyn #include <wx/wfstream.h> // vakiot enum { ID_OUTPUT = 10001, ID_FILE, ID_EXIT }; class Ikkuna: public wxFrame { public: Ikkuna(const wxString &title, const wxPoint &pos, const wxSize &size); void OnQuit(wxCommandEvent &evt) {Close(TRUE);}; void OpenFile(wxCommandEvent &evt); wxTextCtrl *op; // kun hiiri menee linkin päälle richeditissä näytetään // messagebox. tämän voi laittaa vaikka avaamaan osoitteen void url(wxTextUrlEvent &evt) { wxMessageBox("url"); }; private: DECLARE_EVENT_TABLE() }; class Ohjelma: public wxApp { public: bool OnInit(); }; class Menu: public wxMenuBar { public: Menu(); }; #endif
main.cpp
#include "main.h" // main-funktio IMPLEMENT_APP(Ohjelma) // asetetaan tapahtumankäsittelijät BEGIN_EVENT_TABLE(Ikkuna, wxFrame) EVT_TEXT_URL(ID_OUTPUT, Ikkuna::url) EVT_MENU(ID_FILE, Ikkuna::OpenFile) EVT_MENU(ID_EXIT, Ikkuna::OnQuit) END_EVENT_TABLE() bool Ohjelma::OnInit() { // luodaan ikkuna Ikkuna *window = new Ikkuna("Tiedoston avaaja", wxPoint (150, 150), wxSize(400, 300)); // pitää palauttaa TRUE jos kaikki meni hyvin return TRUE; } Ikkuna::Ikkuna(const wxString &title, const wxPoint &pos, const wxSize &size) :wxFrame((wxFrame *) NULL, -1, title, pos, size) { // luodaan tekstikenttä op = new wxTextCtrl(this, ID_OUTPUT, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_RICH2|wxTE_AUTO_URL|wxHSCROLL); // asetetaan valikko SetMenuBar(new Menu); // luodaan tilarivi CreateStatusBar(); // näytetään ikkuna Show(TRUE); } void Ikkuna::OpenFile(wxCommandEvent &evt) { // mitä tiedostoja avataan wxString files = "C++ files (*.cpp;*.h)|*.cpp;*.h|Text files (*.txt)|*.txt|All files(*.*)|*.*"; // näytetään tiedostonvalintaikkuna wxString file = wxFileSelector("Avaa tekstitiedosto", "", "main.cpp", "", files, wxOPEN, NULL); // jos tiedosto on valittu if(!file.empty()) { char * buffer; // avataan tiedosto wxFFileInputStream inp(file); // jos tiedosto saatiin auki if(inp.Ok()) { // mennään tiedoston loppuun inp.SeekI(0, wxFromEnd); // haetaan tiedoston pituus int length = inp.TellI(); // mennään tiedoston alkuun inp.SeekI(0); // varataan muistia buffer = new char [length]; // luetaan tiedosto inp.Read(buffer,length); // laitetaan tiedoston sisältö tekstikenttään op->SetValue(buffer); // kirjoitetaan tilarivillr SetStatusText(wxString("Avattu tiedosto " + file)); // vapautetaan muisti delete []buffer; } } }
menu.cpp
#include "main.h" Menu::Menu() { // luodaan uusi valikko wxMenu* FileMenu = new wxMenu(); // lisätään valikkoon valinnat FileMenu->Append(ID_FILE, wxT("&Avaa"), wxT("Avaa tiedosto")); // lisätään erotin FileMenu->AppendSeparator(); FileMenu->Append(ID_EXIT, wxT("&Exit"), wxT("Sulje ohjelma")); // lisätään valikko menubariin Append(FileMenu, "&Tiedosto"); }
Siistiä koodia ja hyvät kommentoinnit. Tuo wxWidgets taitaa olla juuri se, mitä tarvitsen. Ihmettelen vain, kannattaako laittaa DevPak-linkki versioon 2.5.3, eikös se ole kehitysversio eikä varsinainen julkaisu (2.4.2)?
Juu, 2.5.3 on kehitysversio. Tuo oli vain ensimmäinen toimiva DevPak minkä löysin, eikä siinä ole ollut mitään havaittavaa vikaa.
Vuotaa muistia, koska yhtä lukuun ottamatta new-kutsujen jälkeen ei vapauteta resursseja delete-kutsuilla.
lainaus:
Vuotaa muistia, koska yhtä lukuun ottamatta new-kutsujen jälkeen ei vapauteta resursseja delete-kutsuilla.
Ei pitäisi vuotaa. wxWidgetsissä parent ikkuna vastaa childien tuhoamisesta.
En kyllä itte osais tehä...
^^ itekki pitäis wxWidgetsin käyttöö ehkä opetella.
Koska ohjeiden linkit ovat toimimattomia ja Linkku ei enää käy putkassa niin laitan tähän linkin josta saat aina uusimman vakaan version ohjeet. http://docs.wxwidgets.org/stable/
Aihe on jo aika vanha, joten et voi enää vastata siihen.