📄 gtk_tut_it.sgml
字号:
<tscreen><verb>void gtk_table_set_row_spacings (GtkTable *table, gint spacing);</verb></tscreen><p>e<tscreen><verb>void gtk_table_set_col_spacings (GtkTable *table, gint spacing);</verb></tscreen><p>Notate che con queste chiamate, all'ultima riga e all'ultima colonnanon viene assegnata alcuna spaziatura.<!-- ----------------------------------------------------------------- --><sect1>Esempio di Impacchettamento con Tabelle <p>In questo esempio creiamo una finestra avente tre bottoni dispostiin una tabella 2x2. I primi due bottoni li mettiamo nella riga superiore.Un terzo bottone, quit, lo mettiamo nella riga inferioe, in modo dacomprendere entrambe le colonne. Ciò significa che dovremmoavere qualcosa di questo tipo:<p><? <CENTER> ><?<IMG SRC="gtk_tut_table.gif" VSPACE="15" HSPACE="10" ALT="Table Packing Example Image" WIDTH="180" HEIGHT="120">><? </CENTER> >Ecco il codice sorgente: <tscreen><verb>/* table.c */#include <gtk/gtk.h>/* la nostra funzione di ritorno. * i dati passati a questa funzione vengono stampati su stdout */void callback (GtkWidget *widget, gpointer data){ g_print ("Hello again - %s was pressed\n", (char *) data);}/* questa funzione fa uscire dal programma */void delete_event (GtkWidget *widget, gpointer data){ gtk_main_quit ();}int main (int argc, char *argv[]){ GtkWidget *window; GtkWidget *button; GtkWidget *table; gtk_init (&argc, &argv); /* creiamo una nova finestra */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* predisponiamo il titolo per la finestra */ gtk_window_set_title (GTK_WINDOW (window), "Table"); /* creiamo un gestore per delete_event che esca immediatamente * da GTK. */ gtk_signal_connect (GTK_OBJECT (window), "delete_event", GTK_SIGNAL_FUNC (delete_event), NULL); /* regoliamo la larghezza del bordo della finestra. */ gtk_container_border_width (GTK_CONTAINER (window), 20); /* creiamo una tabella 2x2 */ table = gtk_table_new (2, 2, TRUE); /* mettiamo la tabella nella finesta principale */ gtk_container_add (GTK_CONTAINER (window), table); /*creiamo il primo bottone */ button = gtk_button_new_with_label ("button 1"); /* quando viene premuto il bottone, chiamiamo la funzione di ritorno * con un puntatore a "button 1"come argomento */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "button 1"); /* inseriamo il bottone 1 nel quadrante in alto a sinistra della tabella */ gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 1, 0, 1); gtk_widget_show (button); /* creiamo il secondo bottone */ button = gtk_button_new_with_label ("button 2"); /* quando si preme il bottone, chiamamo la funzione di ritorno * con un puntatore a "button 2"come argomento */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (callback), (gpointer) "button 2"); /* inseriamo il secondo bottone nel quadrate in alto a destra della tbella */ gtk_table_attach_defaults (GTK_TABLE(table), button, 1, 2, 0, 1); gtk_widget_show (button); /* creiamo il botone "Quit" */ button = gtk_button_new_with_label ("Quit"); /* quando viene premuto questo bottone, chiamiamo la funzione "delete_event" * e si esce dal programma */ gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (delete_event), NULL); /* inseriamo il pulsante quit nelle due casele in basso della tabella */ gtk_table_attach_defaults (GTK_TABLE(table), button, 0, 2, 1, 2); gtk_widget_show (button); gtk_widget_show (table); gtk_widget_show (window); gtk_main (); return 0;}</verb></tscreen><!-- ***************************************************************** --><sect>Panoramica sui Widget<!-- ***************************************************************** --><p>La procedura generale di creazione di un widget in GTK prevede i seguenti passi:<enum><item> gtk_*_new - una delle varie funzioni che servono per greare un nuovo widget.In questa sezione le vedremo tutte in dettaglio.<item> Connettere tutti i segnali che si vogliono usare alle funzione gestione appfropriate.<item> Assegnare gli attributi all'oggetto.<item> Impacchettare l'oggetto in un contenitore usando la chiamate appropriata, per esempio gtk_container_add() o gtk_box_pack_start().<item> Mostrare l'oggetto con gtk_widget_show().</enum><p>gtk_widget_show() fa sì che GTK sappia che abbiamo terminato di assegnare gliattributi 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 suggeriscodi 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 siformano. I figli di un oggetto grafico (anche una finestra è un oggetto grafico) nonvengono infatti mostrati finché la finestra stessa non viene mostrata usando lafunzione gtk_widget_show().<!-- ----------------------------------------------------------------- --><sect1> Casting<p>Noterete andando avanti che GTK usa un sistema di casting di tipo. Questa operazioneviene sempre effettuata usando delle macro che allo stesso tempo controllano lapossibilità di effettuare il cast sull'elemento dato e lo effettuano realmente.Alcune macro che avrete modo di incontrare sono:<itemize><item> GTK_WIDGET(widget)<item> GTK_OBJECT(object)<item> GTK_SIGNAL_FUNC(function)<item> GTK_CONTAINER(container)<item> GTK_WINDOW(window)<item> GTK_BOX(box)</itemize>Tutte queste funzioni sono usate per fare il cast di argomenti di funzione. Le vedretenegli esempi, e capirete se è il caso di usarle semplicemente guardando alledichiarazioni delle funzioni.Come potrete vedere più sotto nella gerarchia delle classi, tutti i GtkWidgetssono derivati dalla classe base GtkObject. Ciò significa che potete usare unwidget in ogni posto in cui una funzione richiede un oggetto - semplicementeusate la macro GTK_OBJECT().Per esempio:<tscreen><verb>gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(callback_function), callback_data);</verb></tscreen> Questo fa il cast del bottone in un oggetto e fornisce alla chiamata di ritornoun cast al puntatore a funzione.Molti oggetti grafici sono anche contenitori. Se guardate alla gerarchia delleclassi più sotto, vedrete che molti oggetti grafici sono derivati dalla classeGtkContainer. 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 moltoeducativa. Infatti, non è difficile imparare come funziona un oggetto solo guardandole dichiarazioni delle funzioni.<!-- ----------------------------------------------------------------- --><sect1>Gerarchia degli Oggetti Grafici<p>Ecco, per vostro riferimento, la gerarchia delle classi usata per implementare glioggetti grafici. <tscreen><verb> 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</verb></tscreen><!-- ----------------------------------------------------------------- --><sect1>Oggetti senza Finestre<p>Gli oggetti seguenti non hanno una finestra associata. Se volete catturare degli eventi, dovrete usare l'oggetto GtkEventBox. Vedete anche la sezione su<ref id="sec_The_EventBox_Widget" name="Il Widget EventBox"><tscreen><verb>GtkAlignmentGtkArrowGtkBinGtkBoxGtkImageGtkItemGtkLabelGtkPixmapGtkScrolledWindowGtkSeparatorGtkTableGtkAspectFrameGtkFrameGtkVBoxGtkHBoxGtkVSeparatorGtkHSeparator</verb></tscreen><p>Proseguiremo la nostra esplorazione di GTK esaminando uno alla volta tuttigli oggetti, creando qualche semplice funzione per mostrarli. Un'altrabuona sorgente è il programma testgtk.c che viene fornito con GTK. Potetetrovarlo in gtk/testgtk.c.<!-- ***************************************************************** --><sect>Il Widget Bottone (Button)<!-- ***************************************************************** --><!-
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -