设为首页 加入收藏

TOP

12.5.1 使用box排列控件
2013-10-12 06:48:03 来源: 作者: 【 】 浏览:103
Tags:12.5.1 使用 box 排列 控件

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, 
GtkWidget *child,
gint expand,
gint fill,
gint padding );

参数的含义如下。

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);
GtkWidget* gtk_toggle_button_new_with_label(gchar *label);

对于双态按钮,经常需要在回调函数中判断按钮的状态是否被选中。方法如下:

void toggle_button_callback(GtkWidget *widget, gpointer data)
{
if(GTK_TOGGLE_BUTTON(widget)->active)
{
//按钮被选择时的处理代码
}
}

可以使用下面这个函数,设置按钮的状态:

void gtk_toggle_button_set_state(GtkToggleButton *toggle, gint state)

参数的含义如下。

toggle:要设置状态的按钮。

state:要设置的状态,值为TRUE把按钮设置为未选中状态,FLASE把按钮设置为选中。

生成check按钮的函数为:

GtkWidget* gtk_check_button_new(void);
GtkWidget* gtk_check _button_new_with_label(gchar *label);

生成radio按钮的函数为:

GtkWidget* gtk_radio_button_new(GSList *group);
GtkWidget* gtk_radio_button_new_with_label(GSList *group , gchar *label);

radio按钮是成组出现的,因此需要一个参数group。

例12-3  按钮控件和box容器的使用,程序名为button_box.c。

#include
/*按下某个按钮后,在命令行上打印出按钮名和新的状态*/
void click_button(GtkWidget *widget,gpointer *data)
{
g_print("%s ",(char *)data);
if(GTK_TOGGLE_BUTTON(widget)->active)
g_print("state is active\n");
else
g_print("state is not active\n");
}
void destroy(GtkWidget *widget,gpointer *data) 
{
gtk_main_quit();
}
int main(int argc,char **argv)
{
GtkWidget       *window;
GtkWidget       *box;
GSList          *group;
GtkWidget       *check,*radio;

gtk_init(&argc,&argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
g_signal_connect(GTK_OBJECT(window),"destroy",
GTK_SIGNAL_FUNC(destroy),NULL);
gtk_container_border_width(GTK_CONTAINER(window),50);
/*生成一个垂直box容器,并将该容器加入到主窗口中*/
      box = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),box);

/*以下生成两个check按钮,将它们加入到box容器中,并显示出来*/
check = gtk_check_button_new_with_label("coffee");
g_signal_connect(GTK_OBJECT(check),"clicked",
GTK_SIGNAL_FUNC(click_button),"check button1");
gtk_box_pack_start(GTK_BOX(box),check,TRUE,TRUE,0);
gtk_widget_show(check);

check = gtk_check_button_new_with_label("tea");
g_signal_connect(GTK_OBJECT(check),"clicked",
GTK_SIGNAL_FUNC(click_button),"check button2");
gtk_box_pack_start(GTK_BOX(box),check,TRUE,TRUE,0);
gtk_widget_show(check);

/*以下生成3个radio按钮,将它们加入到box容器中,并显示出来*/
/*
注意:生成第一个radio按钮时group参数为NULL,而后每次在该组中创建一个radio按钮都要
使用gtk_radio_button_group 函数获取新的group值
*/
radio = gtk_radio_button_new_with_label(NULL,"Apple");
g_signal_connect(GTK_OBJECT(radio),"clicked",
GTK_SIGNAL_FUNC(click_button),"Apple");
gtk_box_pack_start(GTK_BOX(box),radio,TRUE,TRUE,0);
gtk_widget_show(radio);

group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
radio = gtk_radio_button_new_with_label(group,"Banana");
g_signal_connect(GTK_OBJECT(radio),"clicked",
GTK_SIGNAL_FUNC(click_button),"Banana");
gtk_box_pack_start(GTK_BOX(box),radio,TRUE,TRUE,0);
gtk_widget_show(radio);

group = gtk_radio_button_group(GTK_RADIO_BUTTON(radio));
radio = gtk_radio_button_new_with_label(group,"Orange");
g_signal_connect(GTK_OBJECT(radio),"clicked",
GTK_SIGNAL_FUNC(click_button),"Orange");
/*将第三个radio按钮设置为选中状态*/
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio),TRUE);
gtk_box_pack_start(GTK_BOX(box),radio,TRUE,TRUE,0);
gtk_widget_show(radio);

gtk_widget_show(box);
gtk_widget_show(window);

gtk_main();
return 0;
}

运行程序后,显示如图12-3所示的界面。

图12-3  运行结果界面


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇12.4 GTK+的面向对象机制 下一篇12.1.1 Qt和GTK+

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: