⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtk_tut_it.sgml

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 SGML
📖 第 1 页 / 共 5 页
字号:
<!doctype linuxdoc system><article><title>GTK Tutorial<author>Ian Main <tt><htmlurl url="mailto:imain@gtk.org"			      name="&lt;imain@gtk.org&gt;"></tt>,Tony Gale <tt><htmlurl url="mailto:gale@gtk.org"			      name="&lt;gale@gtk.org&gt;"></tt><date>May 24th, 1998  - Traduzione aggiornata al 27 Maggio 1998<abstract>Tradotto da Michel Morelli, <tt><htmlurl url="mailto:ziobudda@chiara.dei.unipd.it" name="ziobudda@chiara.dei.unipd.it"></tt>, Daniele Canazza, <tt><htmlurl url="mailto:dcanazz@tin.it" name="dcanazz@tin.it"></tt> e Antonio Schifano, <tt><htmlurl url="mailto:schifano@cli.di.unipi.it" name="schifano@cli.di.unipi.it"></tt></abstract><!-- ***************************************************************** --><sect>Introduzione<!-- ***************************************************************** --><p>GTK (GIMP Toolkit) &egrave; stato orginariamente sviluppato come toolkit peril programma GIMP (General Image Manipulation Program). GTK &egrave; costruitosulla base del kit di disegno di GIMP, il GDK (GIMP Drawing Kit) il quale&egrave; costruito a sua volta attorno alle funzioni della Xlib. E' chiamato``toolkit di GIMP'' perch&eacute; era inizialmente scritto per sviluppare GIMP,ma ora viene utilizzato nello sviluppo di molti progetti software ``free''. Gli autori sono<itemize><item> Peter Mattis   <tt><htmlurl url="mailto:petm@xcf.berkeley.edu"                           name="petm@xcf.berkeley.edu"></tt>     <item> Spencer Kimball <tt><htmlurl url="mailto:spencer@xcf.berkeley.edu"                           name="spencer@xcf.berkeley.edu"></tt><item> Josh MacDonald <tt><htmlurl url="mailto:jmacd@xcf.berkeley.edu"                           name="jmacd@xcf.berkeley.edu"></tt></itemize><p>GTK &egrave; essenzialmente una API (application programmers interface)orientata agli oggetti.Anche se scritto completamente in C, &egrave; implementato usando l'idea delleclassi e delle funzioni di callback (puntatori a funzioni).<p>C'&egrave; anche una terza componente chiamata glib che contiene una serie diimplementazioni differenti di alcune chiamate di funzioni standard e anchealcune funzioni aggiuntive, per esempio per la manipolazione delle liste collegate. Le funzioni sostitutive sono usate per migliorare la portabilit&agrave; di GTK. Alcune delle funzioni implementate qui non sonodisponibili o non sono standard,  altre sono uniche come g_strerror().Altre contengono miglioramenti alle stesse della libc come g_malloc che ha delle utility di debugging migliorate.<p>Questo tutorial &egrave; un tentativo di documentare il meglio possibile lalibreria gtk e non pretende di essere completo. Questo tutorial suppone unabuona conoscenza del linugaggio C e di come creare programmi in C. Sarannofacilitati i lettori che hanno una precedente esperienza nella programmazionein X. Se il GTK &egrave; il primo insieme di widget che studiate, vi prego didirmi come avete trovato questo tutorial e che tipo di problemi avete avuto.Notate che c'&egrave; anche una versione per il C++ della libreria GTK (chiamataGTK--), quindi se preferite utilizzare questo linguaggio al posto del C potrestecercare questa versione al posto della GTK normale.Ci sono poi un ``wrapper'' Objective C e un collegamento a Guile, ma non neseguo l'evoluzione.<p>Mi farebbe molto piacere conoscere qualsiasi problema che abbiate avutonell'imparare il GTK da questo documento e apprezzerei anche critiche sul comemigliorarlo.<!-- ***************************************************************** --><sect>Iniziamo<!-- ***************************************************************** --><p>La prima cosa da fare &egrave; 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 &egrave; il sito<htmlurl url="http://www.gtk.org/" name="http://www.gtk.org/">. 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>Per iniziare la nostra introduzione a GTK, cominceremo con il pi&ugrave; sempliceprogramma possibile. Questo programma crea una finestra con dimensioni (in pixel)di 200x200 e l'unica possibilit&agrave; di uscita &egrave; di ucciderlo usando lashell o il Window Manager.<tscreen><verb>#include <gtk/gtk.h>int main (int argc, char *argv[]){    GtkWidget *window;        gtk_init (&amp;argc, &amp;argv);        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    gtk_widget_show (window);        gtk_main ();        return 0;}</verb></tscreen>Tutti i programmi GTK includeranno sicuramente &lt;gtk/gtk.h&gt; in cui vengonodichiarate le variabili, le funzioni, le strutture, etc. che saranno usate nellatua applicazione GTK.<p>La linea seguente: <tscreen><verb>gtk_init (&amp;argc, &amp;argv);</verb></tscreen>invoca la funzione gtk_init(gint *argc, gchar ***argv) che sar&agrave; 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:<itemize><item> <tt/--display/<item> <tt/--debug-level/<item> <tt/--no-xshm/<item> <tt/--sync/<item> <tt/--show-events/<item> <tt/--no-show-events/</itemize><p>Rimuove poi questi argomenti dalla lista degli argomenti passati, lasciandoquelli non riconosciuti a disposizione della vostra applicazione che potr&agrave;tenerne conto o ignorarli.In questo modo si crea un set di argomenti standard accettato da tutte leapplicazioni GTK.<p>Le seguenti 2 linee di codice creano e mostrano la finestra.<tscreen><verb>  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  gtk_widget_show (window);</verb></tscreen>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&agrave;. Invece di creare una finestra avente dimensioni 0x0, la dimensionedi una finestra senza figli (altri widget, come i bottoni, etc) &egrave; predefinitaa 200x200 cos&igrave; che si possa manipolarla.La funzione gtk_widget_show()  fa s&igrave; che GTK sappia che abbiamo finito disettare gli attributi di questo widget e che quindi quest'ultimo pu&ograve; esserevisualizzato.<p>L'ultima linea ci fa entrare nel ciclo principale del GTK.<tscreen><verb>gtk_main ();</verb></tscreen>gtk_main() &egrave; un'altra chiamata che vedrete in tutte le applicazioni GTK.Quando il controllo raggiunge questo punto, l'applicazione si metter&agrave; 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.<!-- ----------------------------------------------------------------- --><sect1>Hello World in GTK<!-- ----------------------------------------------------------------- --><p>Ok, ora un programma con un widget (un bottone). E' il classico ``Hello World''alla GTK. <tscreen><verb>/* 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&agrave; 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 (&amp;argc, &amp;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 &eacute; NULL     * ed &eacute; 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() &eacute; definita sopra. */    gtk_signal_connect (GTK_OBJECT (button), "clicked",			GTK_SIGNAL_FUNC (hello), NULL);        /* Questo far&agrave; s&igrave; che la finestra venga distrutta dalla chiamata     * gtk_widget_destroy(window) quando il bottone verr&agrave; 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 &eacute; 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;}</verb></tscreen><!-- ----------------------------------------------------------------- --><sect1>Compilare hello World<!-- ----------------------------------------------------------------- --><p>Per compilare si utilizza :<tscreen><verb>gcc -Wall -g helloworld.c -o hello_world `gtk-config --cflags` \    `gtk-config --libs`</verb></tscreen>(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 <tt>gtk-config</>, che vienedistribuito con gtk. Questo programma 'sa' che opzioni di compilatoresono necessarie per compilare i programmi che usano gtk.<tt>gtk-config --cflags</> d&agrave; come risultato una lista di directoryin cui i file di include devono essere cercati, e <tt>gtk-config --libs</>fornisce invece la lista delle librerie che devono essere linkate con ledirectory in cui devono essere cercate.<p>Le librerie che normalmente vengono linkate sono:<itemize><item> la libreria glib (-lglib), contiene varie funzioni, ma solo g_print() &eacute; usato in questo esempio. GTK si appoggia a questalibreria, quindi essa viene sempre, comunque, linkata. Vedi comunquela  sezione sulla <ref id="sec_glib" name="glib"> per altri dettagli.<item>La libreria GDK (-lgdk), la copertura della X11.<item>La libreria GTK (-lgtk), la libreria dei widget, basata sulla GDK.<item>La libreria Xlib(-lX11) la quale &egrave; usata dalla GDK.<item>La libreria Xext(-lXext). Questa contiene il codice per le pixmap amemoria condivisa e altre estensioni di X.<item>La libreria matematica (-lm). Questa &eacute; usata dalla GTK pervari scopi.</itemize><!-- ----------------------------------------------------------------- --><sect1>Teoria dei segnali e delle funzioni di ritorno (callback)<p>Prima di guardare in dettaglio ``Hello World'', parleremo un po' degli eventie delle funzioni di ritorno. GTK  &egrave; un toolkit guidato dagli eventi,il che significa che se ne star&agrave; a dorimire in gtk_main finch&eacute;non succede un evento ed il controllo viene passato alla funzione appropriata.<p>Questo passaggio di controllo &egrave; basato sull'idea dei segnali.Quando si ha un evento, come la pressione di un bottone del mouse, verr&agrave;emesso il segnale appropriato, per esempio dal widget che &eacute; stato premuto.Questo &egrave; il modo in cui GTK fa molto del suo utile lavoro. Per fars&igrave; 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:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -