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();
};
#endifmain.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.