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

📄 gtk_tut_it-4.html

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>GTK Tutorial: Come ``Impacchettare'' i Widget </TITLE> <LINK HREF="gtk_tut_it-5.html" REL=next> <LINK HREF="gtk_tut_it-3.html" REL=previous> <LINK HREF="gtk_tut_it.html#toc4" REL=contents></HEAD><BODY BGCOLOR="#FFFFFF"><A HREF="gtk_tut_it-5.html">Avanti</A><A HREF="gtk_tut_it-3.html">Indietro</A><A HREF="gtk_tut_it.html#toc4">Indice</A><HR NOSHADE><H2><A NAME="s4">4. Come ``Impacchettare'' i Widget </A></H2><P>Nel momento in cui si crea un'applicazione, normalmente si avr&agrave; lanecessit&agrave; di mettere pi&ugrave; di un unico bottone all'interno diuna finestra. Il nostro primo esempio ``Hello World'' usava un solo oggetto,cosicch&eacute; abbiamo potuto usare semplicemente una chiamata agtk_container_add per impacchettare il widget nella finestra. Quando invecesi vuole inserire pi&ugrave; di un unico widget in una finestra, come si faa controllare dove vengono posizionati i propri oggetti? E' qui che entra ingioco il meccanismo dell'``impacchettamento''.<H2><A NAME="ss4.1">4.1 Teoria delle Scatole per Impacchettamento</A></H2><P>La maggior parte dell'impacchettamento viene effettuata creando delle scatolecome nell'esempio pi&ugrave; sopra. Le scatole sono dei contenitori invisibilidi widget che possiamo usare per imballarci i nostri oggetti e che esistono indue variet&agrave;: in particolare si possono avere scatole orizzontali (hbox)e verticali (vbox).Quando si impacchentano degli oggetti in una scatola orizzontale, gli oggettivengono inseriti orizzontalmente da sinistra a destra oppure da destra a sinistraa seconda della chiamata di funzione che si usa. In una scatola verticale, glioggetti vengono inseriti dall'alto in basso o viceversa. Si pu&ograve; usarequalsiasi combinazione di scatole all'interno o a fianco di altre scatole, finoad ottenere l'effetto desiderato.<P>Per creare una nuova scatola orizzontale, si usa una chiamata a gtk_hbox_new(),mentre per le scatole verticali si usa gtk_vbox_new(). Per inserire i widgetall'interno di questi contenitori si usano le funzioni gtk_box_pack_start() egtk_box_pack_end(). La funzione gtk_box_pack_start() comincer&agrave; dall'altoverso il basso in una vbox e da sinistra a destra in una hbox. gtk_box_pack_end()fa l'opposto, impacchettando dal basso verso l'alto in una vbox e da destra asinistra in una hbox. Queste funzioni ci permettono di giustificare a destra oa sinistra i nostri widget, e possono essere mescolate in qualsiasi modo perottenere l'effetto desiderato. Useremo gtk_box_pack_start() nella maggior partedei nostri esempi. Un oggetto pu&ograve; essere costituito da un altro contenitoreo da un oggetto grafico. Infatti, molti oggetti grafici sono a loro volta deicontenitori, compreso il bottone, anche se tipicamente all'interno del bottonemettiamo solo una etichetta.<P><P>Usando queste chiamate, GTK riesce a capire dove si vogliono piazzare i propriwidget, in modo di essere poi in grado di effettuare il ridimensionamentoautomatico e altre cose interessanti. Esiste poi un insieme di opzioni che riguardanoil modo in cui i propri oggetti grafici dovrebbero essere impacchettati. Comesi pu&ograve; immaginare, questo metodo d&agrave; una buona flessibilit&agrave; nella creazione enella disposizione dei propri widget.<P><H2><A NAME="ss4.2">4.2 Dettagli sulle Scatole</A></H2><P>A causa di questa flessibilit&agrave;, le scatole per impacchettamento del GTKpossono, di primo acchito, creare un po' di disorientamento. Sono infatti disponibilimolte opzioni, e non &egrave; immediato il modo in cui si combinano l'una con l'altra.Alla fine per&ograve;, si possono ottenere essenzialmente cinque diversi stili.<P><P> <CENTER ><IMG SRC="gtk_tut_packbox1.gif" VSPACE="15" HSPACE="10" WIDTH="528" HEIGHT="235"ALT="Box Packing Example Image"> </CENTER ><P>Ogni linea contiene una scatola orizzontale (hbox) con diversi bottoni. La chiamata a  gtk_box_pack &egrave; una scorciatoia per la chiamata diimpacchettamento di ognuno dei bottoni nella hbox. Ognuno dei bottoni vieneimpacchettato nella hbox nello stesso modo (cio&egrave;, con gli stessiargomenti per la funzione gtk_box_pack_start ()).<P>Questa &egrave; la dichiarazione della funzione gtk_box_pack_start.<P><BLOCKQUOTE><CODE><PRE>void gtk_box_pack_start (GtkBox    *box,                         GtkWidget *child,                         gint       expand,                         gint       fill,                         gint       padding);</PRE></CODE></BLOCKQUOTE>Il primo argomento &egrave; la scatola nella quale si stanno inscatolando iwidget, il secondo &egrave; il widget stesso. Gli oggetti per ora saranno bottoni, quindi quello che faremo sar&agrave; impacchettare bottoni in scatole.<P>L'argomento ``expand'' in  gtk_box_pack_start() o  gtk_box_pack_end() controllase gli oggetti devono essere sistemati nella scatola in modo da riempire tuttolo spazio in diponibile presente nella scatola, in modo che la scatola si espandafino ad occupare tutta l'area assegnatale (valore TRUE).La scatola pu&ograve; anche essere rimpiciolita in modo da contenere esattamente iwidget (valore FALSE). Assegnare a expand il valore FALSE permette di giustificarea destra o sinistra i propri oggetti. In caso contrario, tutti gli ogetti siespandono fino ad adattarsi alla scatola, e il medesimo effetto si pu&ograve;ottenere usando solo una delle funzioni gtk_box_pack_start o pack_end.<P>L'argomento ``fill'' delle funzioni gtk_box_pack stabilisce se lo spazio disponibilenella scatola deve essere allocato agli oggetti (TRUE) o se deve essere mantenutocome riempimento attorno a questi oggetti (FALSE). Questo argomento ha effettosolo se a expand &egrave; assegnato il valore TRUE.<P>Quando si crea una nuova scatola, la funzione ha questo aspetto:<P><BLOCKQUOTE><CODE><PRE>GtkWidget * gtk_hbox_new (gint homogeneous,                          gint spacing);</PRE></CODE></BLOCKQUOTE><P>L'argomento homogeneous di gtk_hbox_new (la stesso per gtk_vbox_new)determina se ogni oggetto nella scatola deve avere la stessa dimensione(cio&egrave; la stessa ampiezza in una hbox o la stessa altezza in una vbox).Se &egrave; settato, l'argomento expand delle routine gtk_box_pack &egrave;sempre attivato.<P>Qual &egrave; la differenza fra la spaziatura (che &egrave; stabilita quandola scatola viene creata) e il riempimento (che viene stabilito quando glielementi vengono impacchettati)? La spaziatura viene inserita fra gli oggetti,mentre il riempimento viene aggiuno a ciascuno dei lati dell'oggetti. La seguentefigura dovrebbe chiarire meglio questo punto:<P> <CENTER ><IMG ALIGN="center" SRC="gtk_tut_packbox2.gif" WIDTH="509" HEIGHT="213"VSPACE="15" HSPACE="10" ALT="Box Packing Example Image"> </CENTER ><P><P>Di seguito &egrave; riportato il codice usato per creare le immagini precedenti.L'ho commentato in modo piuttosto pesante, in modo che non dovreste avereproblemi nel seguirlo. Compilatelo voi stessi e provate a giocarci un po'.<P><H2><A NAME="ss4.3">4.3 Programma Dimostrativo di Impacchettamento</A></H2><P><P><BLOCKQUOTE><CODE><PRE>/* packbox.c */#include "gtk/gtk.h"voiddelete_event (GtkWidget *widget, gpointer data){    gtk_main_quit ();}/* Costruisco una nuova hbox riempita con bottoni-etichette. Gli * argomenti per le varabili che ci interessano sono passati * in questa funzione. Non mostriamo la scatola, ma mostriamo * tutto quello che c'e' dentro. */GtkWidget *make_box (gint homogeneous, gint spacing,                     gint expand, gint fill, gint padding) {    GtkWidget *box;    GtkWidget *button;    char padstr[80];        /* costruisco una nuova hbox con i valori appropriati di     * homogeneous e spacing */    box = gtk_hbox_new (homogeneous, spacing);        /* costruisco una serie di bottoni con i valori appropriati */    button = gtk_button_new_with_label ("gtk_box_pack");    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        button = gtk_button_new_with_label ("(box,");    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        button = gtk_button_new_with_label ("button,");    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        /* costruisco un bottone con l'etichetta che dipende dal valore di      * expand. */    if (expand == TRUE)            button = gtk_button_new_with_label ("TRUE,");    else            button = gtk_button_new_with_label ("FALSE,");        gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        /* Questo e' la stessa cosa della creazione del bottone per "expand"     * piu' sopra, ma usa la forma breve. */    button = gtk_button_new_with_label (fill ? "TRUE," : "FALSE,");    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        sprintf (padstr, "%d);", padding);        button = gtk_button_new_with_label (padstr);    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        return box;}intmain (int argc, char *argv[]){    GtkWidget *window;    GtkWidget *button;    GtkWidget *box1;    GtkWidget *box2;    GtkWidget *separator;    GtkWidget *label;    GtkWidget *quitbox;    int which;        /* La nostra inizializzazione, non dimenticatela! :) */    gtk_init (&amp;argc, &amp;argv);        if (argc != 2) {        fprintf (stderr, "uso: packbox num, dove num &egrave; 1, 2, o 3.\n");        /* questo fa solo un po' di pulizia in GTK, ed esce con un valore 1. */        gtk_exit (1);    }        which = atoi (argv[1]);    /* Creiamo la nostra finestra */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    /* Ci si dovrebbe sempre ricordare di connettere il segnale di destroy     * alla finestra principale. Cio' e' molto importante per avere un funzionamento     * corretto dal punto di vista intuitivo */    gtk_signal_connect (GTK_OBJECT (window), "delete_event",                        GTK_SIGNAL_FUNC (delete_event), NULL);    gtk_container_border_width (GTK_CONTAINER (window), 10);        /* Creiamo una scatola verticale (vbox) in cui impacchettare quelle     * orizzontali. Questo ci permette di impilare le scatole orizzontali     * piene di bottoni una sull'altra in questa vbox. */      box1 = gtk_vbox_new (FALSE, 0);        /* Decide quale esempio si deve mostrare. Corrispondono alle figure precedenti */    switch (which) {    case 1:        /* creare una nuova etichetta. */        label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");                /* allineare l'etichetta al lato sinistro. Discuteremo questa e altre         * funzioni nella sezione dedicata agli attributi degli oggetti grafici. */        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        /* Impacchettare l'etichetta nella scatola verticale (vbox box1).         * Ricordare che gli oggetti che vengono aggiunti in una vbox vengono         * impacchettati uno sopra all'altro in ordine. */        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);                /* mostrare l'etichetta */        gtk_widget_show (label);                /* chiamare la nostra funzione make_box - homogeneous = FALSE,         * spacing = 0, expand = FALSE, fill = FALSE, padding = 0 */        box2 = make_box (FALSE, 0, FALSE, FALSE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);        /* chiamare la nostra funzione make_box - homogeneous = FALSE, spacing = 0,         * expand = FALSE, fill = FALSE, padding = 0 */        box2 = make_box (FALSE, 0, TRUE, FALSE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (FALSE, 0, TRUE, TRUE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                /* Questo crea un separatore. Li conosceremo meglio in seguito,          * comunque sono piuttosto semplici. */        separator = gtk_hseparator_new ();                /* Impacchetta il separatore nella vbox. Ricordare che stiamo impacchettando         * ognuno di questi oggetti in una vbox, cosicch&eacute; essi verranno         * impacchettati verticalmente. */        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);        gtk_widget_show (separator);                /* crea un'altra nuova etichetta e mostrala. */        label = gtk_label_new ("gtk_hbox_new (TRUE, 0);");        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);        gtk_widget_show (label);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (TRUE, 0, TRUE, FALSE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (TRUE, 0, TRUE, TRUE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                /* ancora un nuovo separatore. */        separator = gtk_hseparator_new ();        /* Gli ultimi 3 argumenti per gtk_box_pack_start sono: expand, fill, padding. */        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);        gtk_widget_show (separator);                break;    case 2:        /* creare una nuova etichetta, ricordare che box1 e' la vbox creata          * vicino all'inizio di main() */        label = gtk_label_new ("gtk_hbox_new (FALSE, 10);");        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);        gtk_widget_show (label);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (FALSE, 10, TRUE, FALSE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (FALSE, 10, TRUE, TRUE, 0);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);        gtk_widget_show (box2);                separator = gtk_hseparator_new ();        /* Gli ultimi tre arcomenti di gtk_box_pack_start sono: expand, fill, padding. */        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);        gtk_widget_show (separator);                label = gtk_label_new ("gtk_hbox_new (FALSE, 0);");        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);        gtk_widget_show (label);                /* Gli argomenti sono: homogeneous, spacing, expand, fill, padding */        box2 = make_box (FALSE, 0, TRUE, FALSE, 10);        gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);

⌨️ 快捷键说明

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