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;