消息和回调函数
void callback_func(GtkWidget *widget,gpointer func_data);
这是消息处理函数的原型。参数widget指向要接受消息的控件,参数func_data指向消息产生时传递给该函数的数据
gulong g_signal_connect(GtkObject *object,gchar *name,
Gcallback callback_func,gpointer func_data);
各参数说明如下:
object:指向产生消息的控件
name:消息或事件的名称
callback_func:事件发生后要执行的回调函数
func_data:传递给回调函数的数据,与callback_func()的第二个参数相同
GTK+提供列两种排列控件的方法:一是使用box(盒子),二是使用table(表格)
使用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,该参数才有效
生成一般的按钮有两个函数gtk_button_new()和gtk_button_new_with_label()
在开发中,也常常使用check按钮和radio按钮。它们都是以双态按钮为基础的。可以使用以下函数生成一个
双态按钮,第一个生成无标签按钮,第二个生成有文本标签的按钮。
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把按钮设置为未选中状态,FALSE把按钮设置为选中
生成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);
button_box.c
#include<stdio.h>
#include<gtk/gtk.h>
/* 按下某个按钮后,在命令行上打印出按钮名和新状态 */
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 destory(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),"destory",GTK_SIGNAL_FUNC(destory),NULL);
gtk_container_border_width(GTK_CONTAINER(window),50);
/* 生成一个垂直box容器,并将该容器加入到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),"click 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),"click 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;
}