GTK tutorial 七

The Button Widget

Normal Butons

我们将使用一个例子来说明一个noraml button的创建。

/*button.c*/
#include<stdio.h>
#include<gtk/gtk.h>

static GtkWidget *xmp_lable_box(gchar *xpm_filename, gchar *label_text)
{
    GtkWidget *box;
    GtkWidget *lable;
    GtkWidget *image;

    box = gtk_hbox_new(FALSE, 0);
    gtk_container_set_border_width(GTK_CONTAINER(box), 2);


    image = gtk_image_new_from_file(xpm_filename);

    lable = gtk_label_new(label_text);

    gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 3);
    gtk_box_pack_start(GTK_BOX(box), lable, FALSE, FALSE, 3);

    gtk_widget_show(image);
    gtk_widget_show(lable);

    return box;
}

static void callback(GtkWidget *widget,gpointer data)
{
    g_print("Hello again -%s was pressed\n", (char *)data);
}


int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *button;
    GtkWidget *box;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_title(GTK_WINDOW(window), "Pixmap'd Buttons!");

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(gtk_main_quit), NULL);

    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    button = gtk_button_new();

    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(callback), (gpointer)"cool button");

    box = xmp_lable_box("info.xpm", "cool button");

    gtk_widget_show(box);

    gtk_container_add(GTK_CONTAINER(button), box);
    
    gtk_widget_show(button);

    gtk_container_add(GTK_CONTAINER(window), button);

    gtk_widget_show(window);

    gtk_main();

    return 0;

}

编译命令:

gcc -Wall -g rangewidget.c -o rangewidget `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

Toggle Buttons

toggle button来源于normal button,二者很相似,但是,toggle widget 总是处于两个状态中的一个。状态的改变是通过点击来实现的。GtkToggleButton的active成员是用来表示button状态的。toggle button是check button 和radio button的实现基础。为了改变toggle button以及其raido button、check button的状态,需要调用函数 gtk_toggle_button_set_active,当调用此函数导致状态改变后,button会发送“clicked”和 “toggled”信号。

Check Buttons

check buttons从toggle button 那里继承了很多属性和方法,但是两者看起来是不同的。check button是小正方形,文本显示在小正方形右方。

Radio Buttons

Radio button与check button类似,但是它们是成组出现的,且每次只能选择组中的一项。下面的例子显示了radio button 的用法。

实例运行结果

/*radiobutton.c*/
#include<glib.h>
#include<gtk/gtk.h>

static gboolean close_application(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    gtk_main_quit();
    return FALSE;
}

int main(int argc, char *argv[])
{
    GtkWidget *window = NULL;
    GtkWidget *box1;
    GtkWidget *box2;
    GtkWidget *button;
    GtkWidget *separator;
    GList *group;

    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(close_application), NULL);

    gtk_window_set_title(GTK_WINDOW(window), "radio buttons");
    gtk_container_set_border_width(GTK_CONTAINER(window), 0);

    box1 = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), box1);
    gtk_widget_show(box1);

    box2 = gtk_vbox_new(FALSE, 10);
    gtk_container_set_border_width(GTK_CONTAINER(box2), 10);
    gtk_box_pack_start(GTK_BOX(box1), box2, TRUE, TRUE, 0);
    gtk_widget_show(box2);


    button = gtk_radio_button_new_with_label(NULL, "button 1");
    gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
    gtk_widget_show(button);

    group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button));
    button = gtk_radio_button_new_with_label(group, "button 2");
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
    gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
    gtk_widget_show(button);

    button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), "button 3");
    gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
    gtk_widget_show(button);
/*
    separator = gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(box1), separator, FALSE, TRUE, 0);
    gtk_widget_show(separator);
*/
    box2 = gtk_vbox_new(FALSE, 10);
    gtk_container_set_border_width(GTK_CONTAINER(box2), 10);
    gtk_box_pack_start(GTK_BOX(box1), box2, FALSE, TRUE, 0);
    gtk_widget_show(box2);

    button = gtk_button_new_with_label("close");
    g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(close_application), G_OBJECT(window));
    gtk_box_pack_start(GTK_BOX(box2), button, TRUE, TRUE, 0);
    GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
    gtk_widget_grab_default(button);
    gtk_widget_show(button);
    gtk_widget_show(window);

    gtk_main();

    return 0;
}

编译命令:

gcc -Wall -g radiobutton.c -o radiobutton `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0` 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值