Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: wxWidgets notepad

Sivun loppuun

Linkku [26.12.2004 21:06:31]

#

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

Metabolix [27.12.2004 20:53:28]

#

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

Linkku [28.12.2004 08:27:11]

#

Juu, 2.5.3 on kehitysversio. Tuo oli vain ensimmäinen toimiva DevPak minkä löysin, eikä siinä ole ollut mitään havaittavaa vikaa.

uffis [18.04.2005 15:58:55]

#

Vuotaa muistia, koska yhtä lukuun ottamatta new-kutsujen jälkeen ei vapauteta resursseja delete-kutsuilla.

Linkku [23.04.2005 14:32:04]

#

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.

crafn [28.06.2005 18:53:57]

#

En kyllä itte osais tehä...

moptim [03.12.2007 15:09:37]

#

^^ itekki pitäis wxWidgetsin käyttöö ehkä opetella.

teksturi [27.03.2008 09:27:00]

#

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/


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta