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 );