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; 我的书签
 我的书签
                                 添加书签
 添加书签 移除书签
 移除书签