📄 gtk_tut_it-7.html
字号:
GtkWidget *entry; GtkWidget *button; GtkWidget *check; gtk_init (&argc, &argv); /* creiamo una nuova finestra */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_usize( GTK_WIDGET (window), 200, 100); gtk_window_set_title(GTK_WINDOW (window), "GTK Entry"); gtk_signal_connect(GTK_OBJECT (window), "delete_event", (GtkSignalFunc) gtk_exit, NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); entry = gtk_entry_new_with_max_length (50); gtk_signal_connect(GTK_OBJECT(entry), "activate", GTK_SIGNAL_FUNC(enter_callback), entry); gtk_entry_set_text (GTK_ENTRY (entry), "hello"); gtk_entry_append_text (GTK_ENTRY (entry), " world"); gtk_entry_select_region (GTK_ENTRY (entry), 0, GTK_ENTRY(entry)->text_length); gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0); gtk_widget_show (entry); hbox = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox); gtk_widget_show (hbox); check = gtk_check_button_new_with_label("Editable"); gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(check), "toggled", GTK_SIGNAL_FUNC(entry_toggle_editable), entry); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE); gtk_widget_show (check); check = gtk_check_button_new_with_label("Visible"); gtk_box_pack_start (GTK_BOX (hbox), check, TRUE, TRUE, 0); gtk_signal_connect (GTK_OBJECT(check), "toggled", GTK_SIGNAL_FUNC(entry_toggle_visibility), entry); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(check), TRUE); gtk_widget_show (check); button = gtk_button_new_with_label ("Close"); gtk_signal_connect_object (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC(gtk_exit), GTK_OBJECT (window)); gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); gtk_widget_grab_default (button); gtk_widget_show (button); gtk_widget_show(window); gtk_main(); return(0);}</PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss7.9">7.9 Selettori di Colore</A></H2><P>Il widget selettore di colore è chiaramente un widget che permtte discegliere interattivamente dei colori. Questo widget composto permette all'utentedi selezionare un colore agendo su terne RGB (Red, Green, Blue) e HSV(Hue, Saturation, Value). Questo lo si può fare o agendo sui singoli valoritramite degli slider o inserendoli da tastiera, oppure selezionando direttamente ilcolore da un cerchio (valori H e S) e da una barra (valore V). Opzionalmente, è possibile anche stabilire il grado di trasparenza delcolore.Il widget di selezione di colore emette per ora un solo segnale, "color_changed", cheviene generato ogni volta che il colore corrente nel widget cambia, sia quandoè l'utente a cambiarlo, sia quando viene modificato esplicitamente tramiteuna chiamata a gtk_color_selection_set_color().<P>Diamo ora un'occhiata a cosa ha da offrirci il widget di selezione di colore. Il widget è disponibile in due versioni, gtk_color_selection egtk_color_selection_dialog:<P><BLOCKQUOTE><CODE><PRE>GtkWidget *gtk_color_selection_new(void);</PRE></CODE></BLOCKQUOTE><P>E' probabile che non userete questo costruttore direttamente. Infatti esso crea unwidget GtkColorSelection orfano a cui dovrete assegnare un genitore voi stessi.Il widget GtkColorSelection eredita dal widget GtkVBox. <P><BLOCKQUOTE><CODE><PRE> GtkWidget *gtk_color_selection_dialog_new(const gchar *title);</PRE></CODE></BLOCKQUOTE><P>Questo è il più comune fra i costruttori di selettori di colore. Essocrea un GtkColorSelectionDialog, che eredita da GtkDialog. Esso consiste di unGtkFrame che contiene un widget GtkColorSelection, un GtkHSeparator e unGtkHBox con tre bottoni, "Ok", "Cancel" e "Help". Si arriva a questi bottoniaccedendo ai widget "ok_button", "cancel_button" e "help_button" nella struttura GtkColorSelectionDialog (cioè (GTK_COLOR_SELECTION_DIALOG(colorseldialog)->ok_button).<P><BLOCKQUOTE><CODE><PRE>void gtk_color_selection_set_update_policy(GtkColorSelection *colorsel, GtkUpdateType policy);</PRE></CODE></BLOCKQUOTE><P>Questa funzione stabilisce la politica di aggiornamento. Quella predefinita èGTK_UPDATE_CONTINOUS, che significa che il colore viene aggiornatocontinuamente mano a mano che l'utente trascina gli slider o preme e trascina ilmouse nel cerchio della hue-saturation o nella relativa barra. Se si hanno problemidi prestazioni, si può decidere di usare la politicaGTK_UPDATE_DISCONTINOUSo GTK_UPDATE_DELAYED.<P><BLOCKQUOTE><CODE><PRE>void gtk_color_selection_set_opacity(GtkColorSelection *colorsel, gint use_opacity);</PRE></CODE></BLOCKQUOTE><P>Il widget di selezione di colore permette anche di variare l'opacità di uncolore (conosciuta anche come canale alfa). Questa caratteristica è normalmente disabilitata. Chiamare la precedente funzione, con use_opacity ugualea TRUE abilita la manipolazione dell'opacità. Analogamente, mettendouse_opacity uguale a FALSE la disabiliterà.<P><BLOCKQUOTE><CODE><PRE>void gtk_color_selection_set_color(GtkColorSelection *colorsel, gdouble *color);</PRE></CODE></BLOCKQUOTE><P>Si può assegnare esplicitamente un colore chiamando questa funzionecon un puntatore ad un vettore di colori (gdouble). La lunghezza del vettoredipende dall'attivazione o meno del controllo dell'opacità. La posizione 0contiene la componente rossa, la 1 \ il verde, la 2 il blu e la 3 contienel'opacità (se questa \ attivata, come si è detto pergtk_color_selection_set_opacity()). Tutti i valori sono compresi fra 0.0 e 1.0.<P><BLOCKQUOTE><CODE><PRE>void gtk_color_selection_get_color(GtkColorSelection *colorsel, gdouble *color);</PRE></CODE></BLOCKQUOTE><P>Questa funzione viene usata per ottenere il colore corrente, tipicamente quandosi è ricevuto il segnale "color_changed". Color è un puntatore alvettore di colori da riempire. Vedi la descrizione di questo vettore nella funzionegtk_color_selection_set_color().<P><P>Ecco un semplice esempio che mostra l'uso di GtkColorSelectionDialog.Il programma mostra una finestra che contiene un'area di disegno. Cliccandocisopra, si apre un dialogo di selezione di colore, e se si modifica il colorenella finestra di dialogo verrà cambiato anche il colore dello sfondo.<P><BLOCKQUOTE><CODE><PRE>#include <glib.h>#include <gdk/gdk.h>#include <gtk/gtk.h>GtkWidget *colorseldlg = NULL;GtkWidget *drawingarea = NULL;/* gestore del cambiamento del colore */void color_changed_cb (GtkWidget *widget, GtkColorSelection *colorsel){ gdouble color[3]; GdkColor gdk_color; GdkColormap *colormap; /* recupera la colormap dell'area di disegno */ colormap = gdk_window_get_colormap (drawingarea->window); /* recupera il colore corrente */ gtk_color_selection_get_color (colorsel,color); /* adattamento ad un intero unsigned di 16 bit (0..65535) * e inseriscili nella struttura GdkColor */ gdk_color.red = (guint16)(color[0]*65535.0); gdk_color.green = (guint16)(color[1]*65535.0); gdk_color.blue = (guint16)(color[2]*65535.0); /* Alloca il colore */ gdk_color_alloc (colormap, &gdk_color); /* assegna il colore di sfondo della finestra */ gdk_window_set_background (drawingarea->window, &gdk_color); /* pulisce la finestra */ gdk_window_clear (drawingarea->window);}/* gestore per l'area di disegno */gint area_event (GtkWidget *widget, GdkEvent *event, gpointer client_data){ gint handled = FALSE; GtkWidget *colorsel; /* controlliamo se abbiamo ricevuto un evento di pressione di pulsante */ if (event->type == GDK_BUTTON_PRESS && colorseldlg == NULL) { /* Si , c'e' l'evento e ancora non c'e' alcun colorseldlg! */ handled = TRUE; /* Creiamo una finestra di dialogo per la selezione del colore */ colorseldlg = gtk_color_selection_dialog_new("Select background color"); /* Otteniamo il widget GtkColorSelection */ colorsel = GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel; /* Facciamo la connessione al segnale "color_changed", * ed assegnamo i dati-utente al widget di selezione di colore */ gtk_signal_connect(GTK_OBJECT(colorsel), "color_changed", (GtkSignalFunc)color_changed_cb, (gpointer)colorsel); /* Mostriamo il dialogo */ gtk_widget_show(colorseldlg); } return handled;}/* Chiusura ed uscita dal getore */void destroy_window (GtkWidget *widget, gpointer client_data){ gtk_main_quit ();}/* Main */gint main (gint argc, gchar *argv[]){ GtkWidget *window; /* Inizialliziamo il toolkit, remuoviamo gli argomenti sulla linea di * comando legati a gtk */ gtk_init (&argc,&argv); /* creiamo la finestra base, con titolo e politiche */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW(window), "Color selection test"); gtk_window_set_policy (GTK_WINDOW(window), TRUE, TRUE, TRUE); /* colleghiamo gli eventi "delete" e "destroy" per poter uscire */ gtk_signal_connect (GTK_OBJECT(window), "delete_event", (GtkSignalFunc)destroy_window, (gpointer)window); gtk_signal_connect (GTK_OBJECT(window), "destroy", (GtkSignalFunc)destroy_window, (gpointer)window); /* crea un'area di disegna, stabilisce le dimensioni e raccogli * gli eventi */ drawingarea = gtk_drawing_area_new (); gtk_drawing_area_size (GTK_DRAWING_AREA(drawingarea), 200, 200); gtk_widget_set_events (drawingarea, GDK_BUTTON_PRESS_MASK); gtk_signal_connect (GTK_OBJECT(drawingarea), "event", (GtkSignalFunc)area_event, (gpointer)drawingarea); /* aggiungi l'area di disegno alla finestra e mostrale entrambe */ gtk_container_add (GTK_CONTAINER(window), drawingarea); gtk_widget_show (drawingarea); gtk_widget_show (window); /* entra nel ciclo principale di gtk (che non cede mai il controllo */ gtk_main (); /* soddisfa i compilatori brontoloni */ return 0;}</PRE></CODE></BLOCKQUOTE><P><H2><A NAME="ss7.10">7.10 Selezione di File (File Selections)</A></H2><P>Il widget Selezione di File è un modo rapido e semplice per mostrare unafinestra di dialogo `File'. Questa si presenta completa di bottoni Ok,Cancel e Help, un buon modo per tagliare i tempi di programmazione.<P>Per creare una nuova finestra di selezione file usate:<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_file_selection_new (gchar *title);</PRE></CODE></BLOCKQUOTE><P>Per assegnare il nome del file, ad esempio per predisporre una certadirectory o per dare un certo nome di file per difetto, usate la seguentefunzione:<P><BLOCKQUOTE><CODE><PRE>void gtk_file_selection_set_filename (GtkFileSelection *filesel, gchar *filename);</PRE></CODE></BLOCKQUOTE><P>Per recuperare il testo che l'utente ha inserito o che ha selezionato conil mouse, si usa la funzione:<P><BLOCKQUOTE><CODE><PRE>gchar* gtk_file_selection_get_filename (GtkFileSelection *filesel);</PRE></CODE></BLOCKQUOTE><P>Ci sono anche dei puntatori ai widget che sono contenuti all'internodel widget di selezione file. Si tratta di:<P><UL><LI>dir_list</LI><LI>file_list</LI><LI>selection_entry</LI><LI>selection_text</LI><LI>main_vbox</LI><LI>ok_button</LI><LI>cancel_button</LI><LI>help_button</LI></UL><P>Molto probabilmente potreste voler usare i puntatori a ok_button,cancel_button e help_button per segnalarne l'uso.<P>Ecco un esempio rubato da testgtk.c, nodificato per essere eseguito dasolo. Come potrete vedere, non c'è molto più che la creazione di unwidget di selezione file. In questo esempio, il bottone Help non fa nullamentre è mostrato allo schermo, dal momento che non c'è alcun segnalecollegato con esso. <P><BLOCKQUOTE><CODE><PRE>/* filesel.c */#include <gtk/gtk.h>/* Recupera il nome di file selezionato e stampalo a console */void file_ok_sel (GtkWidget *w, GtkFileSelection *fs){ g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));}void destroy (GtkWidget *widget, gpointer data){ gtk_main_quit ();}int main (int argc, char *argv[]){ GtkWidget *filew; gtk_init (&argc, &argv); /* Crea un nuovo widget di selezione file */ filew = gtk_file_selection_new ("File selection"); gtk_signal_connect (GTK_OBJECT (filew), "destroy", (GtkSignalFunc) destroy, &filew); /* Connette ok_button alla funzione file_ok_sel */ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), "clicked", (GtkSignalFunc) file_ok_sel, filew ); /* Connette cancel_button alla funzione di distruzione del widget */ gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button), "clicked", (GtkSignalFunc) gtk_widget_destroy, GTK_OBJECT (filew)); /* Preassegnamo un nome di file, come se stessimo dando un valore per difetto in dialogo di tipo `` salva con nome '' */ gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), "penguin.png"); gtk_widget_show(filew); gtk_main (); return 0;}</PRE></CODE></BLOCKQUOTE><P><HR NOSHADE><A HREF="gtk_tut_it-8.html">Avanti</A><A HREF="gtk_tut_it-6.html">Indietro</A><A HREF="gtk_tut_it.html#toc7">Indice</A></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -