我按照这里的说明写了一个Gtk +菜单栏.
将条形包装到VBox上时
// "FALSE, TRUE" and "FALSE, FALSE" actually makes no difference
gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar,
TRUE, FALSE, 0);
Run Code Online (Sandbox Code Playgroud)
菜单栏看起来很糟糕,像这样:

当我改为:
gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar,
TRUE, TRUE, 0);
Run Code Online (Sandbox Code Playgroud)
看起来像:

那么,如何让工具栏分配更小的空间?
如果我理解你的问题,你想:
因此,你的包装模式,其它部件(即菜单栏下面的按钮栏)进场(为了清楚起见,我将把它们作为button_hbox与menu_bar分别,因为两者都可以作为"工具栏"资格).
理解传递给gtk_box_pack_start()的布尔布局参数在这里是至关重要的:
第一个expand是TRUE,在计算布局之后,小部件是否应该消耗其容器中剩余的空白空间.以这种方式包装的小部件同样竞争剩余的空间.
第二个,fill是TRUE如果微件应填写它消耗的,而不是在其内部为中心的布局空间(有而来的浅灰色填充).
我们的想法是你有一个(或更多,但现在让我们坚持一个)主要小部件main_vbox,并且该小部件包含两者expand并fill设置为TRUE.它周围的卫星小部件包含expand设置FALSE和fill设置TRUE.例如:
+-------------------------------------------+
| Menu bar: expand = FALSE, fill = TRUE |
+-------------------------------------------+
| Toolbar: expand = FALSE, fill = TRUE |
+-------------------------------------------+ ^
| | |
| | | The height of this widget
| Main widget: expand = TRUE, fill = TRUE | | varies depending on the
| | | height of its container.
| | |
+-------------------------------------------+ v
| Status bar: expand = FALSE, fill = TRUE |
+-------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
在您的情况下,由于您不想menu_bar填充可用空间,button_hbox应该这样做:
// Menu bar: satellite widget, expand = FALSE, fill = TRUE
gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar, FALSE, TRUE, 0);
// Button bar: main widget, expand = TRUE, fill = TRUE
gtk_box_pack_start(GTK_BOX(main_vbox), button_hbox, TRUE, TRUE, 0);
Run Code Online (Sandbox Code Playgroud)