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

📄 gtk_tut_it-8.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: Widget Contenitore</TITLE> <LINK HREF="gtk_tut_it-9.html" REL=next> <LINK HREF="gtk_tut_it-7.html" REL=previous> <LINK HREF="gtk_tut_it.html#toc8" REL=contents></HEAD><BODY BGCOLOR="#FFFFFF"><A HREF="gtk_tut_it-9.html">Avanti</A><A HREF="gtk_tut_it-7.html">Indietro</A><A HREF="gtk_tut_it.html#toc8">Indice</A><HR NOSHADE><H2><A NAME="s8">8. Widget Contenitore</A></H2><H2><A NAME="ss8.1">8.1 Il widget Blocco Note (Notebook)</A></H2><P>Il widget Blocco note &egrave; un insieme di pagine sovrapposte l'una con l'altra, ognuna contente cose diverse. Questo widget &egrave; diventato molto comune nellaprogrammazione delle interfacce utente ed &egrave; un buon metodo per mostrare informazionitra loro correlate ma che debbano essere mostrate separatamente.<P><P>La prima funzione da invocare che si deve conoscere, come si pu&ograve; intuire, &egrave; usataper creare un nuovo Blocco Note.<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_notebook_new (void);</PRE></CODE></BLOCKQUOTE><P>Una volta che il notebook &egrave; sato creato, ci sono 12 funzioni che possonooperare sul widget notebook. Guardiamole individualmente.<P>La prima che vediamo riguarda come posizionare l'indicatore di pagina.Questi inidicatori di pagina o ``linguette'' (come possono anche essere chiamati)possono essere posizionati in quattro posti: alto, basso, sinistra.destra.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_set_tab_pos (GtkNotebook *notebook, GtkPositionType pos);</PRE></CODE></BLOCKQUOTE><P>GtkPositionType sar&agrave; uno dei seguenti valori (molto autoesplicativi)<UL><LI> GTK_POS_LEFT</LI><LI> GTK_POS_RIGHT</LI><LI> GTK_POS_TOP</LI><LI> GTK_POS_BOTTOM</LI></UL><P>GTK_POS_TOP e' il valore predefinito.<P>Ora vediamo come aggiugere le pagine al Blocco Note. Ci sono 3 modi per farlo. Diamoun'occhiata ai primi due insieme, viste che sono molto simili.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_append_page (GtkNotebook *notebook, GtkWidget *child, GtkWidget *tab_label);void gtk_notebook_prepend_page (GtkNotebook *notebook, GtkWidget *child, GtkWidget *tab_label);</PRE></CODE></BLOCKQUOTE><P>Queste funzioni aggiungono pagine al notebook inserendole rispettivamente alla fine(append) o all'inizio (prepend). *child &egrave; il widget che &egrave; posto nella pagina delnotebook e *tab_label e la intestazione della pagina stessa.<P>L'ultima funzione per aggiungere una pagina al notebook contiene tutte le propriet&agrave;delle precedenti due, ma permette di specificare dove posizionare la pagina chesi vuole inserire.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_insert_page (GtkNotebook *notebook, GtkWidget *child, GtkWidget *tab_label, gint position);</PRE></CODE></BLOCKQUOTE><P>I parametri sono gli stessi di _append_ e _prepend_ tranne che per il parametro inpi&ugrave;: ``position''. Questo parametro viene usato per specificare in che posizione ineserire la pagina.<P>Ora che conosciamo come aggiungere le pagine, vediamo come poter toglierne una.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_remove_page (GtkNotebook *notebook, gint page_num);</PRE></CODE></BLOCKQUOTE><P>Questa funzione prende il numero della pagina specificata dal campo page_num erimuove la pagina corrispondente dal Blocco Note.<P>Per trovare qual'&egrave; la pagina corrente nel notebook bisogna usare la funzione:<P><BLOCKQUOTE><CODE><PRE>gint gtk_notebook_current_page (GtkNotebook *notebook);</PRE></CODE></BLOCKQUOTE><P>Le prossime due funzioni sono semplicemente delle chiamate che muovono la pagina del notebook avanti o indietro. Semplicemente forniscono le chiamate alle rispettivefunzioni del widget notebook su si pu&ograve; operare. NB: quando un notebook &egrave;correntemente sull'ultima pagina e viene invocata la funzione gtk_notebook_next_page,il notebook ritorner&agrave; automaticamente alla prima pagina. Logicamente succede ancheil contrario quando invochi gtk_notebook_prev_page e ti trovi sulla prima pagina.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_next_page (GtkNoteBook *notebook);void gtk_notebook_prev_page (GtkNoteBook *notebook);</PRE></CODE></BLOCKQUOTE><P>La prossima funzione stabilisce la pagina ``attiva''. Se si vuole che la paginaprincipale del notebook sia per esempio la 5 (ad esempio) si pu&ograve; usare questafunzione.Se non si usa questa funzione la pagina principale sar&agrave; la 1.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_set_page (GtkNotebook *notebook, gint page_num);</PRE></CODE></BLOCKQUOTE><P>Le prossime due funzioni aggiungono o rimuovono, rispettivamente, le intestazioni ei bordi delle pagine.<P><BLOCKQUOTE><CODE><PRE>void gtk_notebook_set_show_tabs (GtkNotebook *notebook, gint show_tabs);void gtk_notebook_set_show_border (GtkNotebook *notebook, gint show_border);</PRE></CODE></BLOCKQUOTE><P>show_tabs e show_border posso avere come valore TRUE o FALSE (0 or 1).<P>Diamo ora una occhiata ad un esempio. Si tratta di una espansione del codice presodal file testgtk.c che &egrave; compreso in tutte le distribuzioni, e mostra tutte le 13 funzioni. Questo piccolo programma crea una finestra con un notebooke 6 bottoni. Il notebook contiene 11 pagine, aggiunte nei 3 modi differenti (allafine, all'inizio o in qualsiasi posizione). I bottoni permettono di girare le intestazioni, aggiungere/rimuovere le intestazioni e i bordi, rimuovere una pagina, cambiare la pagina avanti e indietro e uscire dal programma.<P><BLOCKQUOTE><CODE><PRE>/* notebook.c */#include &lt;gtk/gtk.h>/* Queta funzione ruota le posizione delle linguette delle pagine */void rotate_book (GtkButton *button, GtkNotebook *notebook){    gtk_notebook_set_tab_pos (notebook, (notebook->tab_pos +1) %4);}/* Aggiunge e rimuove le linguette e i bordi */void tabsborder_book (GtkButton *button, GtkNotebook *notebook){    gint tval = FALSE;    gint bval = FALSE;    if (notebook->show_tabs == 0)            tval = TRUE;     if (notebook->show_border == 0)            bval = TRUE;        gtk_notebook_set_show_tabs (notebook, tval);    gtk_notebook_set_show_border (notebook, bval);}/* Rimuove una pagina */void remove_book (GtkButton *button, GtkNotebook *notebook){    gint page;        page = gtk_notebook_current_page(notebook);    gtk_notebook_remove_page (notebook, page);    /* E' necessario fare un refresh del widget --       Questo forza il widget a ridisegnarsi. */    gtk_widget_draw(GTK_WIDGET(notebook), NULL);}void delete (GtkWidget *widget, gpointer data){    gtk_main_quit ();}int main (int argc, char *argv[]){    GtkWidget *window;    GtkWidget *button;    GtkWidget *table;    GtkWidget *notebook;    GtkWidget *frame;    GtkWidget *label;    GtkWidget *checkbutton;    int i;    char bufferf[32];    char bufferl[32];        gtk_init (&amp;argc, &amp;argv);        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);        gtk_signal_connect (GTK_OBJECT (window), "destroy",                        GTK_SIGNAL_FUNC (destroy), NULL);        gtk_container_border_width (GTK_CONTAINER (window), 10);        table = gtk_table_new(2,6,TRUE);    gtk_container_add (GTK_CONTAINER (window), table);        /* Crea un nuovo notebook, e tabilisce la posizione delle linguette */    notebook = gtk_notebook_new ();    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);    gtk_table_attach_defaults(GTK_TABLE(table), notebook, 0,6,0,1);    gtk_widget_show(notebook);        /* appende una parte delle pagine */    for (i=0; i &lt; 5; i++) {        sprintf(bufferf, "Append Frame %d", i+1);        sprintf(bufferl, "Page %d", i+1);                frame = gtk_frame_new (bufferf);        gtk_container_border_width (GTK_CONTAINER (frame), 10);        gtk_widget_set_usize (frame, 100, 75);        gtk_widget_show (frame);                label = gtk_label_new (bufferf);        gtk_container_add (GTK_CONTAINER (frame), label);        gtk_widget_show (label);                label = gtk_label_new (bufferl);        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);    }            /* Ora aggiungiamo una pagina in una certa posizione */    checkbutton = gtk_check_button_new_with_label ("Check me please!");    gtk_widget_set_usize(checkbutton, 100, 75);    gtk_widget_show (checkbutton);        label = gtk_label_new ("Add spot");    gtk_container_add (GTK_CONTAINER (checkbutton), label);    gtk_widget_show (label);    label = gtk_label_new ("Add page");    gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), checkbutton, label, 2);        /* Ora finalmente aggiungiamo le pagine all'inizio */    for (i=0; i &lt; 5; i++) {        sprintf(bufferf, "Prepend Frame %d", i+1);        sprintf(bufferl, "PPage %d", i+1);                frame = gtk_frame_new (bufferf);        gtk_container_border_width (GTK_CONTAINER (frame), 10);        gtk_widget_set_usize (frame, 100, 75);        gtk_widget_show (frame);                label = gtk_label_new (bufferf);        gtk_container_add (GTK_CONTAINER (frame), label);        gtk_widget_show (label);                label = gtk_label_new (bufferl);        gtk_notebook_prepend_page (GTK_NOTEBOOK(notebook), frame, label);    }        /* Stabilisce quale sar&agrave; la prima pagina che sar&agrave; visualizzata. */    gtk_notebook_set_page (GTK_NOTEBOOK(notebook), 3);            /* Crea un set di bottoni */    button = gtk_button_new_with_label ("close");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               GTK_SIGNAL_FUNC (delete), NULL);    gtk_table_attach_defaults(GTK_TABLE(table), button, 0,1,1,2);    gtk_widget_show(button);        button = gtk_button_new_with_label ("next page");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               (GtkSignalFunc) gtk_notebook_next_page,                               GTK_OBJECT (notebook));    gtk_table_attach_defaults(GTK_TABLE(table), button, 1,2,1,2);    gtk_widget_show(button);        button = gtk_button_new_with_label ("prev page");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               (GtkSignalFunc) gtk_notebook_prev_page,                               GTK_OBJECT (notebook));    gtk_table_attach_defaults(GTK_TABLE(table), button, 2,3,1,2);    gtk_widget_show(button);        button = gtk_button_new_with_label ("tab position");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               (GtkSignalFunc) rotate_book, GTK_OBJECT(notebook));    gtk_table_attach_defaults(GTK_TABLE(table), button, 3,4,1,2);    gtk_widget_show(button);        button = gtk_button_new_with_label ("tabs/border on/off");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               (GtkSignalFunc) tabsborder_book,                               GTK_OBJECT (notebook));    gtk_table_attach_defaults(GTK_TABLE(table), button, 4,5,1,2);    gtk_widget_show(button);        button = gtk_button_new_with_label ("remove page");    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",                               (GtkSignalFunc) remove_book,                               GTK_OBJECT(notebook));    gtk_table_attach_defaults(GTK_TABLE(table), button, 5,6,1,2);    gtk_widget_show(button);        gtk_widget_show(table);    gtk_widget_show(window);        gtk_main ();        return 0;}</PRE></CODE></BLOCKQUOTE><P>E speriamo che questo vi aiuti a creare i Blocco Note per le vostre applicazioni GTK!<P><H2><A NAME="ss8.2">8.2 Finestre Scorribili (Scrolled Windows)</A></H2><P>Le Finestre Scorribili sono usate per creare areee scorribili in una vera finestra.Si pu&ograve; inserire qualsiasi tipo di widget in questo tipo di finestra, e possono poi essere accessibili a prescindere dalle dimensioni usando le barre di scorrimento.<P>La funzione seguente &egrave; usata per creare una nuova scrolled window.<P><BLOCKQUOTE><CODE><PRE>GtkWidget* gtk_scrolled_window_new (GtkAdjustment *hadjustment,                                    GtkAdjustment *vadjustment);</PRE></CODE></BLOCKQUOTE><P>Il primo argomento &egrave; l'aggiustamento (di quanto scendere ognivolta) orizzontale e il secondo &egrave; quello verticale.  A questi si assegnaquasi sempre il valore NULL.<P><P><BLOCKQUOTE><CODE><PRE>void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,                                     GtkPolicyType      hscrollbar_policy,                     GtkPolicyType      vscrollbar_policy);</PRE></CODE></BLOCKQUOTE><P>Questa funzione stabilisce la politica da usare nella barra di scorrimento. Il primoargomento &egrave; la finestra scorribile interessata. Il secondo stabilisce la politicaper la barra di scorrimento orizzontale e il terzo &egrave; quello per la politca verticale.<P>La politica pu&ograve; essere GTK_POLICY AUTOMATIC o GTK_POLICY_ALWAYS.GTK_POLICY_AUTOMATIC decide automaticamente se la barra di scorrimento deve esserevisualizzata, mentre con GTK_POLICY_ALWAYS la barra verr&agrave; sempre mostrata.<P><BLOCKQUOTE><CODE><PRE>/* scrolledwin.c */#include &lt;gtk/gtk.h>void destroy(GtkWidget *widget, gpointer data){    gtk_main_quit();}int main (int argc, char *argv[]){    static GtkWidget *window;    GtkWidget *scrolled_window;    GtkWidget *table;    GtkWidget *button;    char buffer[32];    int i, j;        gtk_init (&amp;argc, &amp;argv);        /* Crea una nuove finestra di dialogo in cui la scrolled window sar&agrave;         inserita. Una finestra di dialogo &egrave; semplicemente come una         finestra normale, ma ha anche un vbox e un separatore orizzontale         gi&agrave; inseriti per difetto. E'un modo semplice per        creare finestre di dialogo. */

⌨️ 快捷键说明

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