16.4 组装盒构件
GUI的布局对其可用性来说至关重要,同样也是最难做好的事情之一。排列构件的真正困难在于,你不能指望所有用户都有相同的屏幕分辨率,或有相同的窗口大小、主题、字体、颜色方案。在一个系统中令人满意的界面在另一个系统中却可能无法显示。
为创建一个在所有系统中都保持一致的GUI,你要避免使用绝对坐标来放置构件,而是釆用一种更灵活的布局系统。GTK+通过容器构件来实现这一目标。它可以用来在应用程序窗口中控制构件的布局。盒构件是一个非常有用的容器构件类型。GTK+还提供了许多其他类型的容器构件,它们在GTK+的在线文档中都有介绍。
盒是一个不可见的构件,它的工作就是包含其他的构件,并控制它们的布局。为了控制盒中每个构件的大小,你为它们指定规则而不是坐标。既然盒构件可以包含任何GtkWidget,而GtkBox本身就是一个GtkWidget,你可以嵌套盒构件来创建复杂的布局。
GtkBox有下面两个主要的子类。
❑ GtkHBox是一个单行的横向组装盒构件。
❑ GtkVBox是一个单列的纵向组装盒构件。
在创建组装盒时,你需要指定两个参数(homogeneous和spacing):
这些参数控制特定组装盒中所有构件的布局。homogeneous是一个布尔值,如果它被设为TRUE,则强制盒中的每个构件都占据相同大小的空间,而不管每个构件的大小。Spacing以像素为单位设置构件间的间距。
一旦创建好组装盒之后,你就可以用gtk_box_pack_start和gtk_box_pack_end函数来添加构件了:
gtk_box_pack_start向GtkHbox的右边和GtkVbox的底部增加构件,而gtk_box_pack_end则向GtkHbox的左边和GtkVbox的顶部增加构件。它们的参数控制组装盒中每个构件的间距和格式,
表16-1描述了可以传递给gtk_box_pack_start或gtk_box_pack_end的参数。
表 16-1
现在让我们来看看这些组装盒构件,并创建一个更复杂的用户界面来展示组装盒的嵌套使用。
实 验 构件容器的布局
在本例中,我们使用GtkHbox和GtkVBox来排列一些简单的GtkLabel构件。标签是一种简单的构件,它用于显示少量的文本。这个程序名为container.c。
运行这个程序,你将在窗口中看到标签构件的布局(见图16-6)。
图 16-6
实验解析
上述创建了两个组装盒构件:hbox和vbox。我们用gtk_box_pack_start在vbox中添加了labell和label2,因为label2是在labell之后添加的,所以label2出现在底部。接下来,vbox本身和label3一起被添加到hbox中。
hbox最后被添加到窗口中,并使用gtk_widget_show_all显示在屏幕上。
理解组装盒布局的最好方式是通过图示(见图16-7)。
图 16-7
现在你已经学过了构件、信号、回调函数和容器构件,这些都是GTK+最本质的内容。但要成为一个优秀的GTK+程序员,你还需要了解如何充分利用好它所提供的各种构件。