盒的细节

由于存在这样的弹性,所以在一开始使用 GTK 中的组装盒(packing box)的时候会有点让人迷惑。这里有许多选项,并且它们不容易一眼看出是如何组合在一起的。然而到最后,这里基本上只有五种不同的风格。

每一行包含一个带有若干按钮的横向盒。gtk_box_pack 是组装每个按钮到横向盒(hbox)的简写。每个按钮都是以同样的方式组装到横向盒里的(例如,以同样参数调用 gtk_box_pack_start() 函数)。

这是 gtk_box_pack_start() 函数的声明。

void gtk_box_pack_start( GtkBox    *box,
                         GtkWidget *child,
                         gboolean   expand,
                         gboolean   fill,
                         guint      padding );

第一个参数是你要把对象组装进去的盒,第二个就是该对象。目前这些对象将都是按钮,即我们要将这些按钮组装到盒中。

gtk_box_pack_start() 和 gtk_box_pack_end() 中的 expand 参数是用来控制构件在盒中是充满所有多余空间这样盒会扩展到充满所有分配给它的空间(TURE);还是盒收缩到仅仅符合构件的大小(FALSE)。设置 expand 为 FALSE 将允许你向左或向右对齐你的构件。否则,它们会在盒中展开,同样的效果只要用 gkt_box_pack_start() 或 gtk_box_pack_end() 之一就能实现。

fill 参数在 gtk_box_pack 中控制多余空间是分配给对象本身(TRUE),还是让多余空间围绕在这些对象周围分布(FALSE)。它只有在 expand 参数也为 TRUE 时才会生效。

当创建一个新盒时,函数看起来像下面这样:

GtkWidget *gtk_hbox_new ( gboolean homogeneous,
                          gint     spacing );

gtk_hbox_new() 的 homogeneous 参数(对于gtk_vbox_new()也是一样)控制是否盒里的每个对象具有相同的大小(例如,在横向盒中等宽,或在纵向盒中等高)。若它被设置,gtk_box_pack()常规函数的expand参数就被忽略了,它本质上总被开启。

spacing(当盒被创建时设置)和 padding(当元素被组装时设置)有什么区别呢?Spacing 是加在对象之间,而 papadding 加在对象的每一边。看下面这张图应该会明白一点:

这面是产生上面这些图片的代码,其中做了不少注释,所以我希望你看下去不会有任何问题。自己编译它并玩玩它吧。