扩展子项
我们探索功能丰富的尺寸分配的下一站是 ::expand 属性。实际上有两个属性,::hexpand 和 ::vexpand,它们有一个有趣的向上传播到小部件层次结构的行为。但这并不是我们今天要讨论的内容,我们只想在中心框小部件的子项设置了 ::hexpand 标志时,为其提供所有可用空间。
再一次,measure() 的实现可以保持原样。再一次,我们需要决定如果多个子项设置了 expand 标志,谁应该先扩展。GtkBox 尝试公平对待其所有子项,并在所有正在扩展的子项之间均匀分配可用的额外空间。另一方面,我们更喜欢中心子项,因为它最重要。
但是我们该如何实现呢?经过一些实验,我认为,如果我们已经因为中心子项不适合而必须将其推到左侧或右侧,那么再使其更大就没有意义了。因此,只有在不是这种情况时,我们才会考虑 expand 标志。
center_expand = gtk_widget_get_hexpand (center); if (left_size > center_x) center_x = left_size; else if (width - right_size < center_pos + center_size) center_x = width - center_width - right_size; else if (center_expand) { center_width = width - 2 * MAX (left_size, right_size); center_x = (width / 2) - (center_width / 2); }
完成此操作后,如果外部子项正在扩展,则可能还有一些空间可以提供给它们。
if (left_expand) left_size = center_pos - left_pos; if (right_expand) right_size = pos + width - (center_pos + center_width);




参考
- 容器秘密:尺寸分配
- 容器秘密:尺寸分配,第 2 部分
- 带有这些更改的代码