GTK 2.0 中的 gtk_box_pack_start() 函数详解
函数功能
gtk_box_pack_start() 是 GTK 2.0 中用于将子控件(Widget)添加到盒状容器(GtkBox)的函数,它会从容器起始位置(水平盒子的左侧或垂直盒子的顶部)开始排列控件。
函数原型
void gtk_box_pack_start(
GtkBox *box, // 目标盒子容器
GtkWidget *child, // 要添加的子控件
gboolean expand, // 是否扩展
gboolean fill, // 是否填充
guint padding // 边距大小(像素)
);
参数说明
- box
盒子容器对象指针,可以是水平盒子(GtkHBox)或垂直盒子(GtkVBox) - child
要添加到盒子中的子控件 - expand
TRUE: 子控件会扩展以占用额外的可用空间
FALSE: 子控件保持其自然大小 - fill
TRUE: 子控件会填充分配给它的所有空间(仅在expand=TRUE时有效)
FALSE: 子控件保持自然大小,周围留有空白 - padding
在子控件周围添加的额外空间(像素数)
使用示例
// 创建一个水平盒子,子控件间距为5像素
GtkWidget *hbox = gtk_hbox_new(FALSE, 5);
// 创建两个按钮
GtkWidget *button1 = gtk_button_new_with_label("按钮1");
GtkWidget *button2 = gtk_button_new_with_label("按钮2");
// 将按钮1添加到盒子中,允许扩展和填充
gtk_box_pack_start(GTK_BOX(hbox), button1, TRUE, TRUE, 0);
// 将按钮2添加到盒子中,不扩展,添加10像素边距
gtk_box_pack_start(GTK_BOX(hbox), button2, FALSE, FALSE, 10);
关键概念
- 扩展(expand)与填充(fill)的区别
expand=TRUE 表示控件可以占用额外的可用空间
fill=TRUE 表示控件会实际扩展到填满分配的空间(需要expand=TRUE) - 排列顺序
控件按照添加的顺序排列,先添加的靠近起始位置 - 边距(padding)
在控件周围添加额外的空白空间 - 配套函数
gtk_box_pack_end() - 从盒子末端开始添加控件
gtk_box_pack_start_defaults() - 使用默认参数添加控件
实际应用场景
include <gtk/gtk.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
// 创建主窗口
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// 创建垂直盒子,子控件间距5像素
GtkWidget *vbox = gtk_vbox_new(FALSE, 5);
// 创建三个按钮
GtkWidget *btn1 = gtk_button_new_with_label("扩展并填充");
GtkWidget *btn2 = gtk_button_new_with_label("不扩展");
GtkWidget *btn3 = gtk_button_new_with_label("扩展但不填充");
// 添加按钮到盒子中
gtk_box_pack_start(GTK_BOX(vbox), btn1, TRUE, TRUE, 0); // 扩展并填充
gtk_box_pack_start(GTK_BOX(vbox), btn2, FALSE, FALSE, 10); // 不扩展,10像素边距
gtk_box_pack_start(GTK_BOX(vbox), btn3, TRUE, FALSE, 0); // 扩展但不填充
// 将盒子添加到窗口
gtk_container_add(GTK_CONTAINER(window), vbox);
// 连接窗口关闭信号
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// 显示所有控件
gtk_widget_show_all(window);
// 进入主循环
gtk_main();
return 0;