Indice

Caricare una gui wxwidgets da un file xml

Autore: Fabio Di Matteo
Ultima revisione: 04/01/2019 - 19:20

Richiede WxWidgets >4

Nell'articolo Introduzione allo sviluppo multipiattaforma con WxWidgets su Gnu/Linux abbiamo imparato a scrivere il codice base per un semplice progetto wxwidgets. Abbiamo costruito la nostra interfaccia grafica a forza di linee di codice c++. Adesso vedremo come realizzare un file xml contenente la nostra gui e caricarlo nel nostro progetto.

Realizzeremo il nostro file xml o per meglio dire il nostro file XRC con Wxformbuilder .

Il nostro file xrc

gui.xrc

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<resource xmlns="http://www.wxwindows.org/wxxrc" version="2.3.0.1">
	<object class="wxDialog" name="dialog0">
		<style>wxDEFAULT_DIALOG_STYLE</style>
		<title></title>
		<centered>1</centered>
		<object class="wxBoxSizer">
			<orient>wxVERTICAL</orient>
			<object class="sizeritem">
				<option>0</option>
				<flag>wxALL</flag>
				<border>5</border>
				<object class="wxTextCtrl" name="text0">
					<value></value>
				</object>
			</object>
			<object class="sizeritem">
				<option>0</option>
				<flag>wxALL</flag>
				<border>5</border>
				<object class="wxButton" name="button0">
					<label>clicca</label>
					<default>0</default>
					<markup>0</markup>
					<bitmap />
				</object>
			</object>
		</object>
	</object>
</resource>

Il codice

Tramite il codice sottostante caricheremo e visualizzeremo il nostro file xrc: main.cc

#include "wx/wx.h" 
#include "wx/xrc/xmlres.h"
 
 
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 MyClass{
	public:
		wxDialog dialog0;
		wxTextCtrl *text0;
		wxButton   *button0;
		void ShowDialog();
		void OnClickme(wxCommandEvent& event);
} ;
 
 
 
bool MyApp::OnInit()
{
    wxXmlResource::Get()->InitAllHandlers(); //inizializziamo 
    wxXmlResource::Get()->Load(wxT("gui.xrc")); //carichiamo il file xrc
 
    MyClass *MainWin = new MyClass(); //instanziamo la nostra classe responsabile
    MainWin->ShowDialog();			  //del caricamento della nostra gui 	
 
    return true;
}
 
 
//Macro che implementa la main() principale
IMPLEMENT_APP(MyApp)
 
 
//L'implementazione della nostra classe responsabile del caricamento della nostra gui
void MyClass::ShowDialog()
{
    //Ricavo il riferimento alla mia finestra principale
    wxXmlResource::Get()->LoadDialog(&dialog0, NULL,  wxT("dialog0"));
 
	//Riferimento alla mia casella di testo
	text0 = XRCCTRL(dialog0, "text0", wxTextCtrl);
 
    //Riferimento al mio button
    button0 = XRCCTRL(dialog0, "button0", wxButton);
 
    //Associo l'evento click di button0 il metodo MyClass::OnClickme
	button0->Bind(wxEVT_BUTTON, &MyClass::OnClickme, this);
 
 
	dialog0.ShowModal();
 
}
 
void MyClass::OnClickme(wxCommandEvent& event)
{
	text0->ChangeValue("Hai cliccato");
	printf("Cliccato!\n");
}

makefile

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

#Windows con mxe
CPP_WIN32 = i686-w64-mingw32.static-g++
OPTS_WIN32 =  `i686-w64-mingw32.static-wx-config --cxxflags --libs`


all:
	make linux
	#make windows #non funziona richiede wxWidgets 4 e non sono disponibili ancora

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

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

clean:
	rm wxtest.exe wxtest