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`