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

📄 gtk_tut-4.html

📁 gtk 开发手册和参考文档。 包括gtk glib gdk等
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Draft//EN"><HTML><HEAD><meta http-equiv="pragma" content="no-cache"><TITLE>GTK导引: 封装物件</TITLE></HEAD><BODY><A HREF="gtk_tut-3.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-3.html"><IMG SRC="prev.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/prev.gif" ALT="Previous"></A><A HREF="gtk_tut-5.html" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut-5.html"><IMG SRC="next.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/next.gif" ALT="Next"></A><A HREF="gtk_tut.html#toc4" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/gtk_tut.html#toc4"><IMG SRC="toc.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/toc.gif" ALT="Contents"></A><HR><H2><A NAME="s4">4. 封装物件</A></H2><P>当我们制作一套软体, 您会希望在视窗内放超过一个以上的按钮.我们第一个范例"hello world"仅用一个物件, 因此我们能够很简单使用gtk_container_add来"封装"该物件到视窗中.但当您希够望放更多的物件到视窗中, 要如何控制它们的位置?这里就要用到"封装"(Packing).<H2><A NAME="ss4.1">4.1 Packing Boxes的理论</A></H2><P>大部份的封装是由产生boxes来达成的.  这些是看不见的widget containers,我们可以用两种形式来将我们的物件封装进去, vertical box及horizontal box.当我们封装物件到一个horizontal box时,物件是依我们呼叫的顺序由右至左平行的被新增进去.在vertical box, 物件是由上至下.您可以将物件插入box, 也可以将boxes插入box, 任意的组合用以产生所想要的效果.<P>要产生horizontal box,我们使用gtk_hbox_new(), 而vertical boxe使用gtk_vbox_new().  gtk_box_pack_start()及gtk_box_pack_end()函数是用来将物件放到containers里面.  gtk_box_pack_start()函数会开始由左至右, 由上至下来封装物件.gtk_box_pack_end()则相反,由下至上, 由右至左.使用这些函数允许我们对右边或对左边较正,而且可以用许多种方式来较正来取得所想要的效果.一个object可以是另一个container或物件.  而且事实上, 许多物件本身也是containers.像按钮就是, 不过我们一般只在按钮中用一个标签.<P>使用这些呼叫, GTK知道要把物件放到那里去, 并且会自动缩放及其它比例上的调整.还有许多其它选项可以控制如何将物件封装在一起.正如您所想的, 这些方法可以给您许多的弹性来制作视窗.<H2><A NAME="ss4.2">4.2 Boxes详述</A></H2><P>由於这样的弹性, packing boxes在一开始使用的话会有点搞糊涂.还有许多其它的选项,一开始还看不太出来它们如何凑在一起.最後您会知道, 他们基本上有五种不同的型式.<P><P>  <IMG ALIGN="center" SRC="packbox1.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/packbox1.gif"VSPACE="15" HSPACE="10" ALT="Box Packing Example Image" WIDTH="528"HEIGHT="235"><P><P>每一行包含一个horizontal box (hbox)及好几个按钮. 所有按钮都是以同样的方式来包入hbox内.<P>这是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><P>第一个参数是您要把object放进去的box,第二个是该object.现在这些物件将会都是按钮.<P>expand参数在gtk_box_pack_start()或gtk_box_pack_end()中控制物件如何在box中排列.expand = TRUE的话它们会填满box中所有额外的空间.expand = FALSE的话, 该box会缩小到刚好该物件的大小.设expand=FALSE您可做好左右较正.否则它们会填满整个box.同样的效果可用tk_box_pack_start或pack_end functions来达成.<P>fill参数在gtk_box_pack中控制额外空间.fill=TRUE该物件会自行产生额外空间,fill=FALSE则由box产生一个在物件周围的填白区域.这只有在expand=TRUE时, 才会有作用.<P>当产生一个新的box, 该函数看起来像这样:<P><BLOCKQUOTE><CODE><PRE>GtkWidget * gtk_hbox_new (gint homogeneous,                          gint spacing);</PRE></CODE></BLOCKQUOTE><P>homogeneous参数在gtk_hbox_new (and the same for gtk_vbox_new)控制每个物件是否有同样的宽或高.若homogeneous=TRUE, 则expand也会被开启.<P>空白(spacing)及填白(padding)有什麽不同呢空白是加在物件之间, 填白只加在物件的一边.看以下这张图可能会明白一点:<P><IMG ALIGN="center" SRC="packbox2.gif" tppabs="http://extend.hk.hi.cn/%7ehusuyu/http/beginner/gtk/packbox2.gif"VSPACE="15" HSPACE="10" ALT="Box Packing Example Image" WIDTH="509"HEIGHT="213"><P>这里是一些用来产生以上影像的程式.我做了蛮多的注解, 希望您不会有问题.将它编译然後玩玩它.<P><H2><A NAME="ss4.3">4.3 封装示范程式</A></H2><P><P><BLOCKQUOTE><CODE><PRE>#include &quot;gtk/gtk.h&quot;voiddestroy (GtkWidget *widget, gpointer *data){    gtk_main_quit ();}/* Make a new hbox filled with button-labels. Arguments for the  * variables we're interested are passed in to this function.  * We do not show the box, but do show everything inside. */GtkWidget *make_box (gint homogeneous, gint spacing,                     gint expand, gint fill, gint padding) {    GtkWidget *box;    GtkWidget *button;    char padstr[80];        /* create a new hbox with the appropriate homogeneous and spacing     * settings */    box = gtk_hbox_new (homogeneous, spacing);        /* create a series of buttons with the appropriate settings */    button = gtk_button_new_with_label (&quot;gtk_box_pack&quot;);    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        button = gtk_button_new_with_label (&quot;(box,&quot;);    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        button = gtk_button_new_with_label (&quot;button,&quot;);    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        /* create a button with the label depending on the value of     * expand. */    if (expand == TRUE)            button = gtk_button_new_with_label (&quot;TRUE,&quot;);    else            button = gtk_button_new_with_label (&quot;FALSE,&quot;);        gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        /* This is the same as the button creation for &quot;expand&quot;     * above, but uses the shorthand form. */    button = gtk_button_new_with_label (fill ? &quot;TRUE,&quot; : &quot;FALSE,&quot;);    gtk_box_pack_start (GTK_BOX (box), button, expand, fill, padding);    gtk_widget_show (button);        sprintf (padstr, &quot;%d);&quot;, 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;        /* Our init, don't forget this! :) */    gtk_init (&amp;argc, &amp;argv);        if (argc != 2) {        fprintf (stderr, &quot;usage: packbox num, where num is 1, 2, or 3.\n&quot;);        /* this just does cleanup in GTK, and exits with an exit status of 1. */        gtk_exit (1);    }        which = atoi (argv[1]);    /* Create our window */    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    /* You should always remember to connect the destroy signal to the     * main window.  This is very important for proper intuitive     * behavior */    gtk_signal_connect (GTK_OBJECT (window), &quot;destroy&quot;,                        GTK_SIGNAL_FUNC (destroy), NULL);    gtk_container_border_width (GTK_CONTAINER (window), 10);        /* We create a vertical box (vbox) to pack the horizontal boxes into.     * This allows us to stack the horizontal boxes filled with buttons one     * on top of the other in this vbox. */    box1 = gtk_vbox_new (FALSE, 0);        /* which example to show.  These correspond to the pictures above. */    switch (which) {    case 1:        /* create a new label. */        label = gtk_label_new (&quot;gtk_hbox_new (FALSE, 0);&quot;);                /* Align the label to the left side.  We'll discuss this function and          * others in the section on Widget Attributes. */        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        /* Pack the label into the vertical box (vbox box1).  Remember that          * widgets added to a vbox will be packed one on top of the other in         * order. */        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);                /* show the label */        gtk_widget_show (label);                /* call our make box function - 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);        /* call our make box function - 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);                /* Args are: 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);                /* creates a separator, we'll learn more about these later,          * but they are quite simple. */        separator = gtk_hseparator_new ();                /* pack the separator into the vbox.  Remember each of these         * widgets are being packed into a vbox, so they'll be stacked         * vertically. */        gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 5);        gtk_widget_show (separator);                /* create another new label, and show it. */        label = gtk_label_new (&quot;gtk_hbox_new (TRUE, 0);&quot;);        gtk_misc_set_alignment (GTK_MISC (label), 0, 0);        gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 0);        gtk_widget_show (label);                /* Args are: 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);                /* Args are: 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);                /* another new separator. */

⌨️ 快捷键说明

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