I sizer sono dei contenitori di componenti della GUI, usati per dimensionare e disporre automaticamente tali componenti sul form. Il programmatore, di conseguenza, non deve preoccuparsi di allinearli o di calcolare le coordinate della loro posizione.
wxBoxSizer - può allineare, sia orizzontalmente sia verticalmente, i componenti che contiene. La scelta viene fatta selezionando il valore wxVertical o wxHorizontal nella riga Orientamento nella finestra delle proprietà, dopo aver selezionato il sizer. Nel caso si scelga l'allineamento Verticale, i componenti incolonnati possono essere centrati, allineati a destra o a sinistra, a seconda del componente più largo. Se si sceglie l'allineamento orizzontale, i componenti in riga possono essere centrati, allineati in alto o allineati in basso, a seconda del componente più alto.
wxStaticBoxSizer - ha lo stesso comportamento del wxBoxSizer ma aggiunge un bordo con un titolo alla regione che contiene i componenti.
wxGridSizer - dispone i componenti su una scacchiera. Nella finestra delle proprietà si possono modificare il numero di righe e il numero di colonne.
![]() Aspetto dell'applicazione |
A lato si vede il risultato che si ottiene seguendo i passi indicati in questo esercizio. Allo studente si richiede di spostare ed allineare i componenti allo scopo di conferire alla finestra dell'applicazione un aspetto che ne migliori la leggibilità |
Preparare una nuova cartella in cui salvare i file del progetto, denominarla "conversione".
Avviare wxDevC++, creare un nuovo progetto basato su wxWidgets Frame e salvarlo nella cartella "conversione".
Aprire la scheda componenti e collocare un wxBoxSizer sul Frame. Assegnargli l'orientamento verticale.
Aggiungere un wxStaticText al sizer e modificare la proprietà Label: "Conversione di unità di misura".
Aggiungere una casella di scelta wxChoice. Nella finestra delle proprietà fare clic sulla riga Items e, nella casella che si apre inserire le seguenti righe:
Scegli U.M. Libbre -> Grammi m3 -> litri Joule -> Calorie pollici -> cm
Premere Ok.
Alla proprietà Index del componente wxChoice assegnare il valore 0, in modo che, per default, compaia la prima voce dell'elenco.
Aggiungere un componente wxStaticText. Cancellare il testo presente nella proprietà Label.
Aggiungere un componente wxEdit.
Aggiungere un wxButton e modificare la proprietà Label in "Converti".
Aggiungere due wxStaticText e cancellare il testo presente nella proprietà Label.
GetCount() restituisce il numero di righe del componente;
GetSelection() restituisce l'indice dell'elemento selezionato (il primo ha indice 0);
SetSelection(int n) imposta o toglie la selezione all'elemento in posizione n nell'elenco;
GetString(int n) restituisce la stringa che occupa la posizione n nell'elenco;
SetString(int pos, wxString&) inserisce una voce (passata per indirizzo) nell'elenco, in posizione pos.
Fare doppio clic sul componente wxButton. Si apre la scheda con il sorgente "ConversioneFrm.cpp". Scorrere la pagina fino a raggiungere l'intestazione della funzione:
void ConversioneFrm::WxButton1Click(wxCommandEvent& event)
e completarla con le seguenti istruzioni:
1 | int indice = WxChoice1->GetSelection() |
2 | wxString str = wxString::Format(wxT("%i"), indice) |
3 | WxEdit1->SetValue(str) |
Il cui significato è il seguente:
Riga | Commento |
1 | dichiara una variabile intera e le assegna il valore corrispondente alla posizione dell'elemento selezionato nel componente Choice. |
2 | dichiara un'istanza di classe wxString. La funzione wxT() converte in formato stringa l'intero specificato tra parentesi tonde, Format trasforma le cifre di un numero in un array di caratteri. |
3 | Scrive nella casella di testo. |
Lanciare l'esecuzione del programma ed osservare come, cambiando l'elemento selezionato e premendo il pulsante, viene riportato il suo indice nella casella di testo. Chiudere l'applicazione e ritornare al wxDevC++.
Dopo la verifica del funzionamento del metodo GetSelection, le righe 2 e 3 devono essere cancellate, o comunque modificate, come verrà illustrato.
L'operazione di conversione è, normalmente, un prodotto tra il valore espresso in una unità di misura e una costante che rappresenta il coefficiente di conversione.
int indice = WxChoice1->GetSelection(); double coeff; switch (indice) { case 0: break; case 1: coeff = 453.6; WxStaticText2->SetLabel(_("da libbre")); WxStaticText3->SetLabel(_("a grammi")); break; case 2: coeff = 1000; WxStaticText2->SetLabel(_("da m3")); WxStaticText3->SetLabel(_("a litri")); break; case 3: coeff = 0.2389; WxStaticText2->SetLabel(_("da joule")); WxStaticText3->SetLabel(_("a calorie")); break; case 4: coeff = 2.54; WxStaticText2->SetLabel(_("da pollici")); WxStaticText3->SetLabel(_("a cm")); break; } double misura = atoi(WxEdit1->GetValue()); misura *= coeff; wxString str = wxString::Format(wxT("%f"), misura); WxStaticText4->SetLabel(str);