Avanti Indietro Indice

## 5. Panoramica sui Widget

La procedura generale di creazione di un widget in GTK prevede i seguenti passi:

1. gtk_*_new - una delle varie funzioni che servono per greare un nuovo widget. In questa sezione le vedremo tutte in dettaglio.
2. Connettere tutti i segnali che si vogliono usare alle funzione gestione appfropriate.
3. Assegnare gli attributi all'oggetto.
4. Impacchettare l'oggetto in un contenitore usando la chiamate appropriata, per esempio gtk_container_add() o gtk_box_pack_start().
5. Mostrare l'oggetto con gtk_widget_show().

gtk_widget_show() fa sì che GTK sappia che abbiamo terminato di assegnare gli attributi dell'oggetto grafico, e che è pronto per essere visualizzato. Si può anche usare la funzione gtk_widget_hide per farlo sparire di nuovo. L'ordine in cui mostrate gli oggetti grafici non è importante, ma io suggerisco di mostrare per ultima la finestra, in modo che questa spunti fuori già completa, invece di vedere i singoli oggetti che arrivano sullo schermo a mano a mano che si formano. I figli di un oggetto grafico (anche una finestra è un oggetto grafico) non vengono infatti mostrati finché la finestra stessa non viene mostrata usando la funzione gtk_widget_show().

## 5.1 Casting

Noterete andando avanti che GTK usa un sistema di casting di tipo. Questa operazione viene sempre effettuata usando delle macro che allo stesso tempo controllano la possibilità di effettuare il cast sull'elemento dato e lo effettuano realmente. Alcune macro che avrete modo di incontrare sono:

- GTK_WIDGET(widget)
- GTK_OBJECT(object)
- GTK_SIGNAL_FUNC(function)
- GTK_CONTAINER(container)
- GTK_WINDOW(window)
- GTK_BOX(box)

Tutte queste funzioni sono usate per fare il cast di argomenti di funzione. Le vedrete negli esempi, e capirete se è il caso di usarle semplicemente guardando alle dichiarazioni delle funzioni.

Come potrete vedere più sotto nella gerarchia delle classi, tutti i GtkWidgets sono derivati dalla classe base GtkObject. Ciò significa che potete usare un widget in ogni posto in cui una funzione richiede un oggetto - semplicemente usate la macro GTK_OBJECT().

Per esempio:

> `

>     gtk_signal_connect(GTK_OBJECT(button), "clicked",
>                        GTK_SIGNAL_FUNC(callback_function), callback_data);

> `

Questo fa il cast del bottone in un oggetto e fornisce alla chiamata di ritorno un cast al puntatore a funzione.

Molti oggetti grafici sono anche contenitori. Se guardate alla gerarchia delle classi più sotto, vedrete che molti oggetti grafici sono derivati dalla classe GtkContainer. Ognuna di queste classi può essere usata, con la macro GTK_CONTAINER, come argomento per funzioni che richiedono un contenitore.

Sfortunatamente, in questo tutorial non si parlerà in modo estensivo di queste macro, ma raccomando di dare un'occhiata ai file header di GTK. Può essere una cosa molto educativa. Infatti, non è difficile imparare come funziona un oggetto solo guardando le dichiarazioni delle funzioni.

## 5.2 Gerarchia degli Oggetti Grafici

Ecco, per vostro riferimento, la gerarchia delle classi usata per implementare gli oggetti grafici.

> `

>       GtkObject
>        +GtkData
>        | +GtkAdjustment
>        | `GtkTooltips
>        `GtkWidget
>          +GtkContainer
>          | +GtkBin
>          | | +GtkAlignment
>          | | +GtkEventBox
>          | | +GtkFrame
>          | | | `GtkAspectFrame
>          | | +GtkHandleBox
>          | | +GtkItem
>          | | | +GtkListItem
>          | | | +GtkMenuItem
>          | | | | `GtkCheckMenuItem
>          | | | |   `GtkRadioMenuItem
>          | | | `GtkTreeItem
>          | | +GtkViewport
>          | | `GtkWindow
>          | |   +GtkColorSelectionDialog
>          | |   +GtkDialog
>          | |   | `GtkInputDialog
>          | |   `GtkFileSelection
>          | +GtkBox
>          | | +GtkButtonBox
>          | | | +GtkHButtonBox
>          | | | `GtkVButtonBox
>          | | +GtkHBox
>          | | | +GtkCombo
>          | | | `GtkStatusbar
>          | | `GtkVBox
>          | |   +GtkColorSelection
>          | |   `GtkGammaCurve
>          | +GtkButton
>          | | +GtkOptionMenu
>          | | `GtkToggleButton
>          | |   `GtkCheckButton
>          | |     `GtkRadioButton
>          | +GtkCList
>          | +GtkFixed
>          | +GtkList
>          | +GtkMenuShell
>          | | +GtkMenuBar
>          | | `GtkMenu
>          | +GtkNotebook
>          | +GtkPaned
>          | | +GtkHPaned
>          | | `GtkVPaned
>          | +GtkScrolledWindow
>          | +GtkTable
>          | +GtkToolbar
>          | `GtkTree
>          +GtkDrawingArea
>          | `GtkCurve
>          +GtkEditable
>          | +GtkEntry
>          | | `GtkSpinButton
>          | `GtkText
>          +GtkMisc
>          | +GtkArrow
>          | +GtkImage
>          | +GtkLabel
>          | | `GtkTipsQuery
>          | `GtkPixmap
>          +GtkPreview
>          +GtkProgressBar
>          +GtkRange
>          | +GtkScale
>          | | +GtkHScale
>          | | `GtkVScale
>          | `GtkScrollbar
>          |   +GtkHScrollbar
>          |   `GtkVScrollbar
>          +GtkRuler
>          | +GtkHRuler
>          | `GtkVRuler
>          `GtkSeparator
>            +GtkHSeparator
>            `GtkVSeparator

> `

## 5.3 Oggetti senza Finestre

Gli oggetti seguenti non hanno una finestra associata. Se volete catturare degli eventi, dovrete usare l'oggetto GtkEventBox. Vedete anche la sezione su Il Widget EventBox

> `

>     GtkAlignment
>     GtkArrow
>     GtkBin
>     GtkBox
>     GtkImage
>     GtkItem
>     GtkLabel
>     GtkPixmap
>     GtkScrolledWindow
>     GtkSeparator
>     GtkTable
>     GtkAspectFrame
>     GtkFrame
>     GtkVBox
>     GtkHBox
>     GtkVSeparator
>     GtkHSeparator

> `

Proseguiremo la nostra esplorazione di GTK esaminando uno alla volta tutti gli oggetti, creando qualche semplice funzione per mostrarli. Un'altra buona sorgente è il programma testgtk.c che viene fornito con GTK. Potete trovarlo in gtk/testgtk.c.

Avanti Indietro Indice