Differences

This shows you the differences between two versions of the page.

Link to this comparison view

appunti3s:libreria_wxwidget [2018/04/25 07:55] (current)
Line 1: Line 1:
 +====== Libreria Wxwidget ======
 +{{http://​wxwidgets.org/​}}
 +Vengono presentati tre esempi. Richiedono l'​installazione delle librerie wxwidget, di codelite e di wxformbuilder
 +===== esempio da riga di comando =====
 +Comando per compilare il seguente codice sorgente
 +<​code>​g++ gui1.cpp `wx-config --libs` `wx-config --cxxflags` -o gui1</​code>​
  
 +<file cpp gui1.h>
 +#include <​wx/​app.h>​
 +
 +class MiaApp : public wxApp
 +{
 +public: ​
 +   ​virtual bool OnInit();
 +};
 +
 +DECLARE_APP(MiaApp) //vedi gui1.cpp
 +
 +class MiaCornice : public wxFrame
 +{
 +public:
 +   ​MiaCornice(const wxString &title, const wxPoint &pos, const wxSize &size);
 +   /​*~MiaCornice();​*/​
 +   void Uscire(wxCommandEvent&​ event);
 +   
 +protected:
 +   ​DECLARE_EVENT_TABLE() //vedi gui1.cpp
 +
 +private:
 +   ​wxButton* b1;
 +
 +};
 +</​file>​
 +
 +<file cpp gui1.cpp>​
 +#include <​wx/​wxprec.h>​
 +#ifndef WX_PRECOMP
 +#       ​include <​wx/​wx.h>​
 +#endif
 +
 +#include "​gui1.h"​
 +
 +BEGIN_EVENT_TABLE(MiaCornice,​wxFrame) //associa ad ogni evento un metodo di getione
 + EVT_BUTTON(1001,​MiaCornice::​Uscire)
 +END_EVENT_TABLE()
 +
 +IMPLEMENT_APP(MiaApp) //crea il main e il metodo wxGetApp e fa inizializzazioni
 +
 +bool MiaApp::​OnInit()
 +{
 +   ​MiaCornice *finestra1 = new MiaCornice(_T("​titolodellafinestra!"​),​ wxDefaultPosition,​wxSize(300,​ 200));
 +   ​finestra1->​Show(true);​
 +   //​SetTopWindow(finestra1);​
 +   ​return true;
 +}
 +
 +MiaCornice::​MiaCornice(const wxString&​ title, const wxPoint&​ pos, const wxSize& size): wxFrame((wxFrame *) NULL, -1, title, pos, size)
 +{
 +   b1 = new wxButton(this,​1001,​_T("​pulsante....."​),​wxDefaultPosition,​ wxDefaultSize,​ 0);
 +}
 +
 +void MiaCornice::​Uscire(wxCommandEvent&​ event)
 +{
 +   ​Close(true);​
 +}
 +</​file>​
 +===== esempio con wxformbuilder =====
 +==== Premessa ====
 +Con [[http://​wxformbuilder.org|wxformbuilder]] costruisco solo la Classe Base per la finestra (MyFrame).
 +Non devo modificare il codice generato da wxformbuilder (MyFrame.cpp) perché la classe base non deve contenere l'​implementazione dei metodi (astratti).
 +
 +Creo invece una classe Derivata (MiaCornice) a partire dalla classe Base creata da wxformbuilder (MyFrame) in modo che ne erediti tutti gli attributi e tutti i metodi.
 +Poi implemento dentro la classe Derivata (MiaCornice) tutti i metodi di cui ho bisogno (per gestire gli eventi).
 +
 +==== Esempio guidato ====
 +  - aprire wxformbuilder
 +  - (a destra) c'​e'​ un progetto vuoto con delle propietà da modificare (a sinistra)
 +    * name: nome del progetto, a piacere...
 +    * path: cartella dove salva i file di codice generato automaticamente
 +    * file: nome del file che conterrà la classe Base (da NON modificare) es: MyFrame
 +    * namespace: a piacere MioNameSpace???​ NON FUNZIONA???
 +  - aprire la scheda Form 
 +    * click prima icona a sinistra, crea una classe (NON UN OGGETTO) tipo wxFrame
 +    * (a destra) c'è un object (NON UN OGGETTO!) con delle proprietà da modificare (a sinistra)
 +    * name: a piacere es: MyFrame
 +    * title: testo sulla barra del titolo a piacere: Titolone blu
 +  - scheda Layout
 +    * click prima icona a sinistra, crea un oggetto tipo wxBoxSizer
 +    * a destra c'è un oggetto, a sinistra le proprietà da modificare
 +    * name: a piacere es: myBSizer1
 +  - Scheda Menu Toolbar
 +    * click prima icona a sinistra, crea un oggetto tipo wxStatusBar
 +    * a destra c'è un oggetto, a sinistra le proprietà da modificare
 +    * name: a piacere es: m_StatusBar1
 +    * fields: numero campi es: 2
 +  - Scheda Menu Toolbar
 +    * click seconda icona a sinistra, crea un oggetto tipo wxMenuBar
 +    * a destra c'è un oggetto, a sinistra le proprietà da modificare
 +    * name: a piacere es: m_MenuBar1
 +    * label: non viene visualizzato??​
 +  - Scheda Menu Toolbar
 +    * click terza icona a sinistra, crea un oggetto tipo wxMenu
 +    * a destra c'è un oggetto, a sinistra le proprietà da modificare
 +    * name: a piacere es: m_Menu1
 +    * label: a piacere es: &File
 +  - Scheda Menu Toolbar
 +    * click quinta icona a sinistra, crea un oggetto tipo wxMenuItem
 +    * a destra c'è un oggetto, a sinistra le proprietà da modificare)
 +    * name: a piacere es: m_MenuQuit
 +    * label: a piacere es: quit...
 +    * id: e' il nome di una costante, che viene automaticamente definita usando #define...
 +    * di questo oggetto di devono modificare anche gli events(a sinistra): OnMenuSelect __Uscire__ (Cioè si indica solo il nome del metodo, senza parametri)
 +  - premere F6
 +    * selezionare la classe Base (MyFrame)
 +    * indicare il nome della futura classe derivata (MiaCornice)
 +    * indicare il nome del file (MiaCornice)
 +    * Generare il codice della classe DERIVATA nella cartella scelta al punto 2
 +  - premere F8
 +    * Generare il codice della classe BASE nella cartella scelta al punto 2
 +  - salvare e uscire
 +  - creare main.cpp e main.h
 +    * dentro main.cpp si deve scrivere una macro che sostituisce il main() e creare l'​oggetto finestra1 dentro il costruttore MiaApp::​MiaApp()
 +    * dentro main.h si deve scrivere una macro e includere gli altri file.h
 +  - editare MiaCornice.cpp
 +    * dentro cui bisogna solo implementare i metodi (Uscire) con il suggerimento // TO DO..//
 +  - per compilare tutto, eseguire il comando
 +    * <​code>​ g++ main.cpp MiaCornice.cpp MyFrame.cpp `wx-config --libs` `wx-config --cxxflags` </​code>​
 +
 +{{appunti3s:​codice1.zip}}
 +===== esempio completo =====
 +
 +====Legenda delle icone====
 +  * cartella blu: {{:​appunti3s:​blu.gif?​|}} workspace
 +  * cartella gialla: {{:​appunti3s:​oro.gif?​|}} project
 +  * cartella marrone: {{:​appunti3s:​marrone.gif?​|}} virtual folder
 +
 +==== Esempio ====
 +  - Aprire codelite
 +  - nel menu Workspace
 +    * new workspace (selezionare checkbox "​separate directory"​)
 +    * new project (selezionare GUI wxFrame e selezionare checkbox "​separate directory"​)
 +    * espandere le cartelle virtuali ed aprire gui.cpp e gui.h
 +  - nella virtual folder RESOURCE (marrone)
 +    * tasto destro sul file **gui.fbp** (open with wxformbuilder)
 +    * versione diversa...? risposta: yes!
 +  - dentro wxformbuilder
 +    * si potrebbe non modificare nulla
 +    * attenzione a NON modificare il nome del progetto (gui)
 +    * del progetto si può modificare la proprietà "​event_generation TABLE"
 +    * attenzione a NON modificare il nome del Frame (MainFrameBase)
 +    * Ogni elemento a cui verrà associato un evento dovrà avere un ID unico: modificare wxID_ANY sostituendolo con una cosa a piacere (Esempio: wxID_MYBUTTON1)
 +    * modificare poi quello tutto che si desidera...
 +    * salvare il progetto
 +    * il codice autogenerato da wxformbuilder (gui.cpp, gui.h) è diverso da quello di codelite
 +    * esportarlo sovrascrivendo i file originali (premendo F8)
 +    * leggi sulla barra di stato: code generated!
 +    * Generare una classe derivata premendo F6: importante usare questi nomi (MainFrame, mainframe)
 +    * chiudere wxformbuilder
 +  - di nuovo dentro codelite
 +    * se gui.cpp era stato aperto, codelite si accorge delle modifiche, chiederà: reload modified file? (ok!)
 +    * tasto destro sul project (giallo) > Import Files from Dir 
 +    * correggere il percorso e selezionare la check box (non è mai selezionata)
 +  - gui.cpp e gui.h //DO NOT MODIFY...// ​
 +  - main.h (per capire confrontarlo con mainframe.h) ​
 +    * cancellare sotto <​code>//​main application frame declaration//​ </​code>​ ECCETTO <​code>#​end_if</​code>​ perché quel codice si trova già in mainframe.h
 +    * sostituire <​code>#​include "​gui.h"</​code>​ con <​code>#​include "​mainframe.h"</​code>​ perché la classe dentro gui.h è solo la classe base.
 +  - main.cpp
 +    * cancellare 4 elementi in fondo: costruttore,​ distruttore e due metodi (ora si trovano in mainframe.cpp) perché si trovano in mainframe.cpp
 +  - mainframe.h
 +    * niente da fare
 +  - mainframe.cpp
 +    * il costruttore viene completamente ereditato (rimane vuoto) ​
 +    * implementare SOLO quello che è suggerito dal commento <​code>//​TO DO// </​code>​
 +    * NB: per esempio, per chiudere la finestra usare Destroy();
 +  - Compilazione
 +    * Prima di compilare assicurarsi di NON essere in debug, ma in release. ​
 +    * premere F7 (build)
 +    * viene creata la cartella RELEASE contenente i file oggetto
 +    * l'​eseguibile ha il nome del Project
 +    * premere CTRL+F5 (Run)
 +    * la modalità Debug produce errore su debian e ubuntu: in casi disperati usare [[appunti3s:​gdb]]
 +
 +{{appunti3s:​codice4.zip}}
  • appunti3s/libreria_wxwidget.txt
  • Last modified: 2018/04/25 07:55
  • (external edit)