gtk图形界面编程day02

来源:互联网 发布:淘宝售后申请时间限制 编辑:程序博客网 时间:2024/05/17 23:32

消息和回调函数

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;}
原创粉丝点击