gtk图形界面编程day02

本文介绍GTK+中的控件使用方法,包括box容器、按钮等,以及如何通过信号和回调函数处理用户事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

消息和回调函数

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值