📄 gtk_tut-4.html
字号:
<!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 "gtk/gtk.h"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 ("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); /* create a button with the label depending on the value of * 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); /* This is the same as the button creation for "expand" * above, but uses the shorthand form. */ 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; /* Our init, don't forget this! :) */ gtk_init (&argc, &argv); if (argc != 2) { fprintf (stderr, "usage: packbox num, where num is 1, 2, or 3.\n"); /* 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), "destroy", 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 ("gtk_hbox_new (FALSE, 0);"); /* 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 ("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); /* 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 + -