📄 gtk_tut_it-2.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>GTK Tutorial: Iniziamo</TITLE> <LINK HREF="gtk_tut_it-3.html" REL=next> <LINK HREF="gtk_tut_it-1.html" REL=previous> <LINK HREF="gtk_tut_it.html#toc2" REL=contents></HEAD><BODY BGCOLOR="#FFFFFF"><A HREF="gtk_tut_it-3.html">Avanti</A><A HREF="gtk_tut_it-1.html">Indietro</A><A HREF="gtk_tut_it.html#toc2">Indice</A><HR NOSHADE><H2><A NAME="s2">2. Iniziamo</A></H2><P>La prima cosa da fare è certamente quella di scaricare il GTK e installarlo.Potete prendere l'ultima versione dal sito ftp.gtk.org in /pub/gtk. Un'altrapossibile sorgente di informazioni è il sito<A HREF="http://www.gtk.org/">http://www.gtk.org/</A>. <P>GTK usa il comando GNU autoconf per autoconfigurarsi. Una volta estratti i file dall'archivio tar, eseguite configure --help pervedere una lista delle opzioni del comando configure.<P><P>Per iniziare la nostra introduzione a GTK, cominceremo con il più sempliceprogramma possibile. Questo programma crea una finestra con dimensioni (in pixel)di 200x200 e l'unica possibilità di uscita è di ucciderlo usando lashell o il Window Manager.<P><BLOCKQUOTE><CODE><PRE>#include <gtk/gtk.h>int main (int argc, char *argv[]){ GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P>Tutti i programmi GTK includeranno sicuramente <gtk/gtk.h> in cui vengonodichiarate le variabili, le funzioni, le strutture, etc. che saranno usate nellatua applicazione GTK.<P><P>La linea seguente: <P><BLOCKQUOTE><CODE><PRE>gtk_init (&argc, &argv);</PRE></CODE></BLOCKQUOTE><P>invoca la funzione gtk_init(gint *argc, gchar ***argv) che sarà usata intutte le applicazioni GTK. Questa funzione sistema alcune cose al posto nostro,come la visuale predefinita e la mappa dei colori, e procede poi chiamandogdk_init(gint *argc, gchar ***argv).Questa funzione inizializza la libreria per l'uso, setta il gestore predefinitodei segnali e guarda negli argomenti, passati via linea di comando alla vostraapplicazione, alla ricerca di uno di questi argomenti:<UL><LI> <CODE>--display</CODE></LI><LI> <CODE>--debug-level</CODE></LI><LI> <CODE>--no-xshm</CODE></LI><LI> <CODE>--sync</CODE></LI><LI> <CODE>--show-events</CODE></LI><LI> <CODE>--no-show-events</CODE></LI></UL><P>Rimuove poi questi argomenti dalla lista degli argomenti passati, lasciandoquelli non riconosciuti a disposizione della vostra applicazione che potràtenerne conto o ignorarli.In questo modo si crea un set di argomenti standard accettato da tutte leapplicazioni GTK.<P><P>Le seguenti 2 linee di codice creano e mostrano la finestra.<P><BLOCKQUOTE><CODE><PRE> window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window);</PRE></CODE></BLOCKQUOTE><P>L'argomento GTK_WINDOW_TOPLEVEL specifica che noi vogliamo che la nostra finestrasi sottometta alle decorazioni del windows manager e alla posizione che quest'ultimoindicherà. Invece di creare una finestra avente dimensioni 0x0, la dimensionedi una finestra senza figli (altri widget, come i bottoni, etc) è predefinitaa 200x200 così che si possa manipolarla.La funzione gtk_widget_show() fa sì che GTK sappia che abbiamo finito disettare gli attributi di questo widget e che quindi quest'ultimo può esserevisualizzato.<P><P>L'ultima linea ci fa entrare nel ciclo principale del GTK.<P><BLOCKQUOTE><CODE><PRE>gtk_main ();</PRE></CODE></BLOCKQUOTE><P>gtk_main() è un'altra chiamata che vedrete in tutte le applicazioni GTK.Quando il controllo raggiunge questo punto, l'applicazione si metterà adormire aspettando che si verifichino eventi di X (come la pressione di un bottoneo di un tasto), timeout o notifiche di Input/Output dai fileNel nostro esempio, comunque, tutti gli eventi vengono ignorati.<P><H2><A NAME="ss2.1">2.1 Hello World in GTK</A></H2><P>Ok, ora un programma con un widget (un bottone). E' il classico ``Hello World''alla GTK. <P><BLOCKQUOTE><CODE><PRE>/* helloworld.c */#include <gtk/gtk.h>/* E' una funzione di ritorno (callback). Gli argomenti passati sono ignorati in questo * esempio.* Piu' informazioni sulle callback in seguito. */void hello (GtkWidget *widget, gpointer data){ g_print ("Hello World\n");}gint delete_event(GtkWidget *widget, gpointer data) { g_print ("delete event occured\n"); /* Se si dà FALSE al gestore del segnale ``delete_event'', GTK emettera' il segnale * ``destroy''. Fornire TRUE significa non volere che la finestra sia distrutta. * Questo e' utile per far uscire delle finestre di dialogo del tipo: * 'sei sicuro di voler uscire ?' * Cambia TRUE in FALSE e la finestra principale sara' distrutta con un "delete_event" */ return (TRUE);}/* Un'altra callback */void destroy (GtkWidget *widget, gpointer data){ gtk_main_quit ();}int main (int argc, char *argv[]){ /* GtkWidget e' il tipo di dato per i Widget */ GtkWidget *window; GtkWidget *button; /* Questa e' una chiamata presente in tutte le applicazioni GTK. Gli argomenti della linea di comando vengono scorsi e restituiti alla applicazione */ gtk_init (&argc, &argv); /* Crea una nuova finestra */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* Quando alla finestra viene passato il segnale ``delete_event'' (questo * segnale viene passato Windows Manager di solito con l'opzione 'close' * o con la barra del titolo (title bar)) noi chiediamo che la funzione * delete_event() (definita sopra) venga invocata. * Il dato passato come argomento alla funzione di ritorno é NULL * ed é ignorato dalla funzione stessa. */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* Qui connettiamo l'evento ``destroy'' al gestore del segnale. * Questo evento accade quando noi chiamimo la funzione gtk_widget_destroy() * sulla finestra o se ritorniamo FALSE dalla callback ``delete_event''. */ gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (destroy), NULL); /* Setta il bordo interno della finestra */ gtk_container_border_width (GTK_CONTAINER (window), 10); /* Crea un nuovo bottone avente etichetta (label) uguale a ``Hello World'' */ button = gtk_button_new_with_label ("Hello World"); /* Quando il bottone riceve il segnale ``clicked'', invochera' la funzione * hello() passando NULL come argomento della funzione. La funzione * hello() é definita sopra. */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (hello), NULL); /* Questo farà sì che la finestra venga distrutta dalla chiamata * gtk_widget_destroy(window) quando il bottone verrà premuto. Ancora, * questo segnale (``destroy'') puo' arrivare da qui o dal windows * manager */ gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (window)); /* Questo inserisce il bottone nella finestra * (un contenitore GTK) */ gtk_container_add (GTK_CONTAINER (window), button); /* Il passo finale é il mostrare questo nuovo widget appena creato */ gtk_widget_show (button); /* e la finestra */ gtk_widget_show (window); /* Tutte le applicazioni GTK devono avere la funzione gtk_main(). * Il controllo finisce qui e attende un evento (come la pressione * di un tasto o l'evento di un mouse). */ gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss2.2">2.2 Compilare hello World</A></H2><P>Per compilare si utilizza :<P><BLOCKQUOTE><CODE><PRE>gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` \ `gtk-config --libs`</PRE></CODE></BLOCKQUOTE>(N.d.T.: se lanciato da linea di comando, il precedente comando dicompilazione va messo su di una unica linea eliminando il backslash) <P>In questo modo, si usa il progamma <CODE>gtk-config</CODE>, che vienedistribuito con gtk. Questo programma 'sa' che opzioni di compilatoresono necessarie per compilare i programmi che usano gtk.<CODE>gtk-config --cflags</CODE> dà come risultato una lista di directoryin cui i file di include devono essere cercati, e <CODE>gtk-config --libs</CODE>fornisce invece la lista delle librerie che devono essere linkate con ledirectory in cui devono essere cercate.<P><P>Le librerie che normalmente vengono linkate sono:<UL><LI> la libreria glib (-lglib), contiene varie funzioni, ma solo g_print() é usato in questo esempio. GTK si appoggia a questalibreria, quindi essa viene sempre, comunque, linkata. Vedi comunquela sezione sulla <A HREF="gtk_tut_it-17.html#sec_glib">glib</A> per altri dettagli.</LI><LI>La libreria GDK (-lgdk), la copertura della X11.</LI><LI>La libreria GTK (-lgtk), la libreria dei widget, basata sulla GDK.</LI><LI>La libreria Xlib(-lX11) la quale è usata dalla GDK.</LI><LI>La libreria Xext(-lXext). Questa contiene il codice per le pixmap amemoria condivisa e altre estensioni di X.</LI><LI>La libreria matematica (-lm). Questa é usata dalla GTK pervari scopi.</LI></UL><P><H2><A NAME="ss2.3">2.3 Teoria dei segnali e delle funzioni di ritorno (callback)</A></H2><P>Prima di guardare in dettaglio ``Hello World'', parleremo un po' degli eventie delle funzioni di ritorno. GTK è un toolkit guidato dagli eventi,il che significa che se ne starà a dorimire in gtk_main finchénon succede un evento ed il controllo viene passato alla funzione appropriata.<P><P>Questo passaggio di controllo è basato sull'idea dei segnali.Quando si ha un evento, come la pressione di un bottone del mouse, verràemesso il segnale appropriato, per esempio dal widget che é stato premuto.Questo è il modo in cui GTK fa molto del suo utile lavoro. Per farsì che un bottone esegua una azione, prepareremo un gestore del segnaleche catturi questi segnali e chiami la funzione corretta. Questo viene fattousando una funzione del tipo:<P><BLOCKQUOTE><CODE><PRE>gint gtk_signal_connect (GtkObject *object, gchar *name, GtkSignalFunc func,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -