POSIZIONAMENTO DEI WIDGET

 

Una volta che abbiamo illustrato come si creano i widget ed in particolare la finestra principale dell'applicazione dobbiamo capire come si posizionano i singoli widget al suo interno.

Teoria del posizionamento.

Quando creiamo un'applicazione e vogliamo inserire nella finestra principale più di un widget come possiamo controllare come questi widget vengono posizionati?

In molti casi ci possiamo avvalere di alcuni widget che svolgono la funzione di contenitori. Questi sono invisibili e possono essere orizzontali o verticali.

Quando inseriamo un widget in un contenitore orizzontale questo viene inserito da sinistra a destra ed in quello verticale dall'alto in basso (o viceversa a seconda della chiamata).
Si possono usare combinazione di contenitori interni od esterni ad altri per ottenere l'effetto desiderato.

Per creare un nuovo contenitore orizzontale si può usare gtk_hbox_new(), e per quello verticale, gtk_vbox_new().
Le funzioni: gtk_box_pack_start() e gtk_box_pack_end() sono usate per inserire gli oggetti in questi contenitori.
La funzione gtk_box_pack_start() posiziona da sopra a sotto e da sinistra a destra, mentre la funzione gtk_box_pack_end() fa l'opposto.
L'uso di queste funzioni permette quindi la giustificazione dei widget all'interno dei contenitori.

Ci sono anche un certo numero di opzioni che permettono di indicare come il widget deve essere posizionato.

Questa è la dichiarazione della funzione the gtk_box_pack_start.

void gtk_box_pack_start( GtkBox *box,
GtkWidget *child,
gint expand,
gint fill,
gint padding );

Il primo argomento è il contenitore in cui l'oggetto deve essere inserito, il secondo è l'oggetto.
Gli argomenti expand e fill permettono di specificare se l'oggetto deve riempire tutto lo spazio disponibile nel contenitore e se deve crescere con il ridimensionamento del contenitore.
L'argomento fill ha effetto solo se anche l'argomento expand è impostato a TRUE.
L'argomento paddintg permette invece di specificare la distanza dai bordi dell'oggetto.

Questa è invece la dichiarazione per la creazione di un nuovo contenitore:

GtkWidget *gtk_hbox_new (gint homogeneous,
gint spacing);

L'argomento homogeneous (TRUE/FALSE) permette di specificare se ogni oggetto in esso deve avere la stessa dimensione.
L'argomento spacing permette di specificare la distanza tra gli oggetti.

Posizionamento con le Tables.

Le Tables rappresentano un altro modo di posizionamento dei widget e possono essere molto utili in alcune situazioni.
Con le Tables in pratica noi creiamo una griglia in cui inserire i widget nelle posizioni specificate.

Questa è la dichiarazione della funzione gtk_table_new:

GtkWidget *gtk_table_new( gint rows,
gint columns,
gint homogeneous );

Il primo argomento è il numero delle righe ed il secondo il numero delle colonne che deve avere la griglia.

Se l'argomento homogeneous viene impostato a TRUE tutti i contenitori presenti nella griglia assumeranno la dimensione del widget più grande in essa contenuto.

Supponendo che abbiamo specificato un numero di righe e di colonne pari a due la table avrà il seguente aspetto:

0           1          2
0+----------+----------+
|           |          |
1+----------+----------+
|           |          |
2+----------+----------+

Il sistema di coordinate parte dall'angolo in alto a sinistra.
Per inserire un widget all'inteno di un contenitore useremo la seguente funzione:

void gtk_table_attach( GtkTable *table,
GtkWidget *child,
gint left_attach,
gint right_attach,
gint top_attach,
gint bottom_attach,
gint xoptions,
gint yoptions,
gint xpadding,
gint ypadding );

Dove il primo argomento è la Table che abbiamo creato ed il secondo il widget che vogliamo inserire.

Gli argomenti left e right top e bottom attach specificano dove posizionare il widget e quanti contenitori usare. Ad esempio: left_attach = 0, right_attach = 2, top_attach = 0,
bottom_attach = 1.

Gli argomenti xoptions e yoptions sono usati per indicare le packing options e possono avere le seguenti forme:

GTK_FILL - Se il contenitore è più largo del widget questo si espanderà usando tutto lo spazio disponibile.
GTK_SHRINK - Se il contenitore è più piccolo il widget si restringerà.
GTK_EXPAND - Se il contenitore si espande il widget si espande con esso.

L'argomento padding permette di specificare la distanza in pixel del widget dal bordo del contenitore.

Poichè gtk_table_attach() ha molte opzioni ecco una scorciatoia:

void gtk_table_attach_defaults( GtkTable *table,
GtkWidget *widget,
gint left_attach,
gint right_attach,
gint top_attach,
gint bottom_attach );

Le opzioni X e Y sono settate di default in GTK_FILL | GTK_EXPAND, ed il padding è settato a zero. Il resto è identico alla precedente funzione.

Sono anche disponibili le funzioni gtk_table_set_row_spacing() and gtk_table_set_col_spacing() che inseriscono una spaziatura tra le righe o colonne specificate:

void gtk_table_set_row_spacing( GtkTable *table,
gint row,
gint spacing );

void gtk_table_set_col_spacing ( GtkTable *table,
gint column,
gint spacing );

Si può anche settare una spaziatura tra tutte le righe e/o le colonne con:

void gtk_table_set_row_spacings( GtkTable *table,
gint spacing );

void gtk_table_set_col_spacings( GtkTable *table,
gint spacing );

 

Torna all'indice