12.5 排列控件
如果要在窗口中放置多个控件,就要考虑如何编排控件的位置。GTK+提供了两种排列控件的方法:一是使用box(盒子),二是使用table(表格)。
12.5.1 使用box排列控件
1.创建和使用box容器
box是一种不可见的widget容器,它有水平排列和垂直排列两种。水平排列是控件按放入窗口的顺序水平排列,垂直排列是按控件放入窗口的顺序垂直排列。水平排列box容器使用函数gtk_hbox_new生成,而垂直排列box容器使用函数gtk_vbox_new生成。box容器生成后,使用函数gtk_box_pack_start或gtk_box_pack_end将控件放入容器中。前者由左向右、从上到下将控件放入box容器,而后者相反,由右至左,从下到上将控件放入box容器中。
下面是具体的函数定义:
Widget* gtk_hbox_new(gint homogeneous, gint spacing); |
参数含义如下。
homogeneous:控制每个放入box的控件是否有同样的高或宽。
spacing:是否在控件之间填充空白。
void gtk_box_pack_start( GtkBox *box, |
参数的含义如下。
box:要放入控件的box容器。
child:要放入box容器的控件。
expand:是否填满box所有额外控件,TRUE表示是,如果为FALSE则该box按控件原始大小显示。gtk_hbox_new函数的参数homogeneous值为TRUE时,该参数才有效。
fill:该值如果为TRUE,控件自行产生外控件;如果为FALSE,box在控件周围产生反白区域。只有expand为TRUE,该参数才有效。
这样的解释可能不好理解,来看一个例子程序就清楚了。在举例之前,先介绍一下按钮控件。
2.check按钮和radio按钮
生成一般的按钮有两个函数:gtk _button_new()和gtk _button_new_with_label()。前者产生一个无标签的按钮,后者生成一个有文本标签的按钮。
在开发中,也常常使用check按钮和radio按钮。它们都有两种状态,一个是选中,另外一个是未选中。所不同的是,在一组按钮中,radio按钮只能有一个被选中,其他都处于未选中状态,而check按钮没有这个限制。它们都是以双态按钮为基础的。可以使用以下函数生成一个双态按钮,第一个生成无标签按钮,第二个生成有文本标签的按钮。
GtkWidget* gtk_toggle_button_new(void); |
对于双态按钮,经常需要在回调函数中判断按钮的状态是否被选中。方法如下:
void toggle_button_callback(GtkWidget *widget, gpointer data) |
可以使用下面这个函数,设置按钮的状态:
void gtk_toggle_button_set_state(GtkToggleButton *toggle, gint state) |
参数的含义如下。
toggle:要设置状态的按钮。
state:要设置的状态,值为TRUE把按钮设置为未选中状态,FLASE把按钮设置为选中。
生成check按钮的函数为:
GtkWidget* gtk_check_button_new(void); |
生成radio按钮的函数为:
GtkWidget* gtk_radio_button_new(GSList *group); |
radio按钮是成组出现的,因此需要一个参数group。
例12-3 按钮控件和box容器的使用,程序名为button_box.c。
#include void destroy(GtkWidget *widget,gpointer *data) int main(int argc,char **argv) /*生成一个垂直box容器,并将该容器加入到主窗口中*/ box = gtk_vbox_new(FALSE,0); |
运行程序后,显示如图12-3所示的界面。
![]() |
| 图12-3 运行结果界面 |
