Barra laterale

programmazione:wxwidgets:introduzione_a_wxwidgets

Introduzione allo sviluppo multipiattaforma con WxWidgets su Gnu/Linux

Autore: Fabio Di Matteo
Ultima revisione: 10/02/2011

WxWidgets è una libreria per lo sviluppo di programmi ,dotati di interfaccia grafica, multipiattaforma. La libreria ha la particolarita' di usare i widget grafici nativi del sistema ospite in modo da integrare ,dal punto di vista grafico, maggiormente le applicazioni con il resto dell'interfaccia grafica.

In questo articolo mostreremo come scrivere un banale programma che lancia altri comandi per poi compilarlo per Linux e anche per Windows. Per la cross-compilazione dell'eseguibile windows ci affideremo a Mngw versione per Linux. Ovvero svilupperemo il nostro programma windows interamente con la nostra Linuxbox.

Installazione wxwidget su Linux

Installare la libreria wxwidgets su linux non è affatto complicato, basta infatti usare il package manager della nostra distribuzione preferita einstallare i pacchetti di sviluppo (su debian/ubuntu libwxgtk2.8-dev, libwxbase2.8-dev ) e i runtime verranno installati in automatico perchè considerati dipendeze.

Installazione del necessario per la crosscompilazione su Linux per windows

Per effettuare la compilazioni di programmi windows su Linux ci serve il compilatore mingw , anche esso di certo tra i pacchetti della nostra distribuzione, e i sorgenti delle librerie wxwidget (scaricabili da qui: http://wxwidgets.org/downloads/).
Scaricati i sorgenti procediamo alla compilazione degli stessi con mingw. In questa guida compileremo le wxwidgets come libreria statica in modo tale che l'eseguibile che produrremo con i nostri programmi conterra al suo interno la libreria stessa e sara' quindi piu' semplice distribuire i nostri programmi sui computer con sistema operativo windows.

Estraiamo quindi i sorgenti una directory e procediamo alla compilazione.

./configure --prefix=/usr/local/wx-widget-win32/ --host=i586-mingw32msvc --build=i686-linux --enable-monolithic --enable-static --disable-shared
make
sudo make install

dove:

  • –prefix=/usr/local/wx-widget-win32/ indica il percorso di installazione delle librerie
  • –host=i586-mingw32msvc indica il compilatore da usare;
  • –enable-monolithic –enable-static –disable-shared indica che compileremo le nostre librerie come libreria statica.

Codice commentato del nostro esempio

Un buon punto di partenza per studiare i wxwidgets potrebbe essere il seguente libro: Cross-Platform GUI Programmingwith wxWidgets

main.cpp

#include "wx/wx.h" 
 
 
 
//La classe per lanciare l' applicazione
class MyApp: public wxApp
{
    //questo metodo è presente in ogni oggetto wxApp
    // serve a lanciare la prima finestra e ad altre inizializzazioni.
    virtual bool OnInit();
};
 
class MyFrame: public wxFrame
{
public:
 
    //Costruttore della mia finestra( ovvero la mia classe)
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
 
    //metodo personalizzato
    void  esegui( wxCommandEvent& event ) ;
 
protected:
	wxTextCtrl* text;
 
//Macro per l'intestazione delle callbacks
DECLARE_EVENT_TABLE()
};
 
//Macro per l'implementazione delle callbacks
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     //wxID_OK e' l'id di mybutton , il mio bottone
     EVT_BUTTON (wxID_OK, MyFrame::esegui )
END_EVENT_TABLE()
 
 
//Macro che implementa la main principale
IMPLEMENT_APP(MyApp)
 
bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( _("wxTest"), wxPoint(550, 50), wxSize(300,190) );
    frame->Show(true);
    SetTopWindow(frame);
    return true;
} 
 
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame( NULL, -1, title, pos, size )
{
 
    //Creo un contenitore di tipo bSizer
    wxBoxSizer* bSizer;
	bSizer = new wxBoxSizer( wxHORIZONTAL );
 
    //Casella di testo che useremo per inviare il comando
    text = new wxTextCtrl( this, wxID_ANY, wxEmptyString,  wxDefaultPosition, wxDefaultSize, 0 );
	bSizer->Add( text, 0, wxALL, 25 );//posiziono la casella di testo sul contenitore
 
    //Creo un bottone
    wxButton* mybutton= new wxButton( this, wxID_OK, wxT("Esegui"),  wxDefaultPosition, wxDefaultSize, 0 );
	bSizer->Add( mybutton, 0, wxALL, 25 );//posiziono il bottone sul contenitore
 
    //Creo una status bar e scrivo del testo dentro essa
    CreateStatusBar();
    SetStatusText( _("Benvenuti nel test dei wxWidgets!") );
 
    //Uso il contenitore 
    this->SetSizer( bSizer );
	this->Layout();
}
 
void MyFrame::esegui( wxCommandEvent& event )
{
	system(text->GetValue().mb_str());
}

Il makefile

Il nostro makefile contiene le istruzioni per la compilazione nativa e anche per la crosscompilazione per windows.
Dunque per compilare solo per Linux bastera' make linux e per windows make windows .
Per avviare il progetto compilato con wine è necessario mettere nella stessa directory il file mingw10.dll contenuto in /usr/share/doc/mingw32-runtime/ oppure copiare il file mingw10.dll in c:\\windows\System32

Non è invece necessario far nulla con i sistemi windows.

#Linux
CPP = g++ 
OPTS =  `wx-config --cxxflags --libs`

#Windows
CPP_WIN32 = i586-mingw32msvc-g++ 
OPTS_WIN32 =  `/usr/local/wx-widget-win32/bin/wx-config --cxxflags --static=yes --libs`


all:
	make linux
	make windows

linux:
	$(CPP) main.cpp -o wxtest $(OPTS)

windows:
	$(CPP_WIN32) main.cpp -o wxtest.exe $(OPTS_WIN32)
	strip wxtest.exe

clean:
	rm wxtest.exe wxtest

programmazione/wxwidgets/introduzione_a_wxwidgets.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)