一、组装盒
组装盒(GtkBox)也称为组合构件。使用组装盒可以将多个构件放在一个容器中。容器可以把组装盒看作是一个构件。不像按钮构件,组装盒在屏幕上时看不见的。事实上,它们是同时跟踪若干子构件的不可见容器。组装盒分为纵向组装盒和横向组装盒。纵向组装盒在垂直方向堆积构件,横向组装盒沿水平方向堆积构件。
使用gtk_vbox_new函数建立纵向组装盒,使用gtk_hbox_new函数建立横向组装盒。在建立组装盒以后,可以使用gtk_box_pack_start函数或gtk_box_pack_end函数将构件放到组装盒中。
为了显示构件,必须将构件放入组装盒中,并将组装盒放在容器内。这等效于使容器具有容纳多个构件的能力。虽然组装盒没有任何可视的部分,但是必须使容器和组装盒成为可视。因为可视性影响加到容器内的构件。
2.
名称:: | gtk_hbox_new gtk_vbox_new |
功能: | 创建一个横向组装盒 (gtk_hbox_new) 创建一个纵向组装盒 (gtk_vbox_new) |
头文件: | #include <gtk/gtk.h> |
函数原形: | GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing); GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing); |
参数: | homogeneous 子构件是否具有同样的大小 spacing 子构件间的距离 |
返回值: | 新的组装盒 |
建立组装盒的函数取两个参数,用来确定组装盒在屏幕上的外观。
第一个参数称为homogeneous.用这一参数来确定所有增加的构件具有同样的大小。例如,在一个横向组装盒中建立5个按钮,分别带有标号:fred、joe、sue、karen和Bartholomew the Great。如果homogeneous参数为FALSE,组装盒建立5个不同大小的按钮,正好在按钮上容纳各自的标号的正文。如果homogeneous参数为TRUE,组装盒计算最大的构件大小,然后按照最大的构件的大小对所有按钮分配同样大小的空间。
第二个参数称为spacing。用它来确定插入组装盒的构件之间的空间。将spacing参数设置为0表示在插入的构件之间不留空间。
3.
名称:: | gtk_box_pack_start gtk_box_pack_end |
功能: | 将构件放到组装盒中 |
头文件: | #include <gtk/gtk.h> |
函数原形: | void gtk_box_pack_start(GtkBox *box,GtkWidget *child,gboolean expend,gboolean fill,guint padding); void gtk_box_pack_end(GtkBox *box,GtkWidget *child,gboolean expend,gboolean fill,guint padding); |
参数: | box 组装盒的名称 child 子构件的名称 expend 构件周围是否还有可扩充的空间 fill 构件是否需要充分利用构件周围空间 padding 构件周围要保留多少个填充的像元 |
返回值: | 无 |
函数gtk_box_pack_start将构件放在顶部(对于纵向组装盒)或左边(对于横向组装盒。函数gtk_box_pack_end将构件放在底部(对于纵向组装盒)或右边(对于横向组装盒)。
gtk_box_paxk_start和gtk_box_pack_end有5个参数,其中3个参数用来确定如何将构件放在组装盒内。
expand参数表示在所有构件加入组装盒以后,构件周围是否还有可扩充的空间。如果用homogenous格式建立组装盒,则忽略这一参数。因为homegeneous参数表示构件在组装盒内使用同样大小的空间。
fill参数表示构件是否需要充分利用构件周围空间。将此参数设置为TRUE允许构件稍稍扩大一点,以充分利用组装盒分配给它的空间。将此参数设置为FALSE强制构件只使用它需要的空间。多余的空间围绕构件的周围分布。
padding参数表示在构件周围要保留多少个填充的像元。多数情况下将它的值设置为0。
- #include <gtk/gtk.h>
- void PackNewButton(Gtk Widget *box,char *szLabel);
- int main(int argc,char *argv[ ])
- {
- GtkWidget *window; /*定义窗体*/
- GtkWidget *box; /*定义组装盒*/
- gtk_init(&argc,&argv); /*初始化GTK+库*/
- window=gtk_window_new(GTK_WINDOW_TOPLEVEL); /*创建窗体*/
- gtk_signal_connect(GTK_OBJECT(window),”destroy”,G_CALLBACK(gtk_main_quit),NULL); /*登记destroy信号,调用退出函数*/
- box=gtk_vbox_new(FALSE,0); /*创建组装盒*/
- PackNewButton(box,”Button1”); /*调用创建按钮函数*/
- PackNewButton(box,”Button2”);
- PackNewButton(box,”Button3”);
- PackNewButton(box,”Button4”);
- PackNewButton(box,”Button5”);
- gtk_container_add(GTK_CONTAINER(window),box); /*把组装盒放入窗体*/
- gtk_widget_show(box); /*使组装盒可视*/
- gtk_widget_show(window); /*使窗体可视*/
- gtk_main(); /*等待用户操作*/
- }
- void PackNewButton(GtkWidget *box,char *szLabel)
- {
- GtkWidget *button;/*定义按钮*/
- button=gtk_button_new_with_label(szLabel); /*创建带标号的按钮*/
- gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); /*把按钮加入组装盒*/
- gtk_widget_show(button); /*使按钮可视*/
- }
下面我们来编译它:
$gcc –o box box.c `pkg-config –cflags –libs gtk+-2.0`
$./box
程序运行后会出现下面的图形:
本例涉及到了按钮的创建,大家暂时不必关注,我会在下面的章节介绍。