Button Boxes
Button Boxes便于对一组button进行布局。此widget 有两个版本,一个创建横向的box,一个创建纵向的box.
下面的例子对其用法进行说明。
程序运行结果
/*buttbox.c*/
#include<gtk/gtk.h>
static GtkWidget *create_bbox(gint horizontal, char *title,
gint spacing, gint child_w,
gint child_h, gint layout)
{
GtkWidget *frame;
GtkWidget *bbox;
GtkWidget *button;
frame = gtk_frame_new(title);
if(horizontal)
bbox = gtk_hbutton_box_new();
else
bbox = gtk_vbutton_box_new();
gtk_container_set_border_width(GTK_CONTAINER(bbox), 5);
gtk_container_add(GTK_CONTAINER(frame), bbox);
gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), layout);
gtk_box_set_spacing(GTK_BOX(bbox), spacing);
button = gtk_button_new_from_stock(GTK_STOCK_OK);
gtk_container_add(GTK_CONTAINER(bbox), button);
button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
gtk_container_add(GTK_CONTAINER(bbox), button);
button = gtk_button_new_from_stock(GTK_STOCK_HELP);
gtk_container_add(GTK_CONTAINER(bbox), button);
return frame;
}
int main(int argc, char *argv)
{
static GtkWidget *window = NULL;
GtkWidget *main_vbox;
GtkWidget *vbox;
GtkWidget *hbox;
GtkWidget *frame_horz;
GtkWidget *frame_vert;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "Button Boxes");
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
main_vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), main_vbox);
frame_horz = gtk_frame_new("Horizontal Button Boxes");
gtk_box_pack_start(GTK_BOX(main_vbox), frame_horz, TRUE,TRUE, 10);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
gtk_container_add(GTK_CONTAINER(frame_horz), vbox);
gtk_box_pack_start(GTK_BOX(vbox), create_bbox(TRUE,"Spread(spacing 40)",
40, 85, 20, GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), create_bbox(TRUE,"Spread(spacing 30)",
30, 85, 20, GTK_BUTTONBOX_EDGE), TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), create_bbox(TRUE,"Spread(spacing 20)",
20, 85, 20, GTK_BUTTONBOX_START), TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), create_bbox(TRUE,"Spread(spacing 10)",
10, 85, 20, GTK_BUTTONBOX_END), TRUE, TRUE, 0);
frame_vert = gtk_frame_new ("Vertical Button Boxes");
gtk_box_pack_start (GTK_BOX (main_vbox), frame_vert, TRUE, TRUE, 10);
hbox = gtk_hbox_new (FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (hbox), 10);
gtk_container_add (GTK_CONTAINER (frame_vert), hbox);
gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Spread (spacing 5)",
5, 85, 20, GTK_BUTTONBOX_SPREAD), TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Edge (spacing 30)",
30, 85, 20, GTK_BUTTONBOX_EDGE), TRUE, TRUE, 5);
gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "Start (spacing 20)",
20, 85, 20, GTK_BUTTONBOX_START), TRUE, TRUE, 5);
gtk_box_pack_start (GTK_BOX (hbox), create_bbox (FALSE, "End (spacing 20)",
20, 85, 20, GTK_BUTTONBOX_END), TRUE, TRUE, 5);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
编译命令:
gcc -Wall -g buttbox.c -o buttbox `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`
Toolbar
toolbar 通常用来将一些widget合并成组,这样利于对组内widget的外形及布局进行定制。一般,toolbar会包含带图标的button、label和tooltips 。当然,其他的widget也能往里放。
接下来举例说明此widget的用法。
运行结果
/*toolbar.c*/
#include<gtk/gtk.h>
GtkWidget * close_button;
GtkWidget *tooltips_button;
GtkWidget *text_button, *icon_button, *both_button;
GtkWidget *entry;
static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
gtk_main_quit();
return FALSE;
}
static void radio_event(GtkWidget *widget, gpointer data)
{
if(GTK_TOGGLE_BUTTON(text_button)->active)
gtk_toolbar_set_style(GTK_TOOLBAR(data), GTK_TOOLBAR_TEXT);
else if(GTK_TOGGLE_BUTTON(icon_button)->active)
gtk_toolbar_set_style(GTK_TOOLBAR(data), GTK_TOOLBAR_ICONS);
else if(GTK_TOGGLE_BUTTON(both_button)->active)
gtk_toolbar_set_style(GTK_TOOLBAR(data), GTK_TOOLBAR_BOTH);
}
static void toggle_event(GtkWidget *widget, gpointer data)
{
gtk_toolbar_set_tooltips(GTK_TOOLBAR(data), GTK_TOGGLE_BUTTON(widget)->active);
}
int main(int argc, char *argv[])
{
GtkWidget *dialog;
GtkWidget *handlebox;
GtkWidget *toolbar;
GtkWidget *iconw;
gtk_init(&argc, &argv);
dialog = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dialog), "GtkToolbar Tutorial");
gtk_widget_set_size_request(GTK_WIDGET(dialog), 600, 300);
GTK_WINDOW(dialog)->allow_shrink = TRUE;
g_signal_connect(G_OBJECT(dialog), "delete_event", G_CALLBACK(delete_event), NULL);
gtk_widget_realize(dialog);
handlebox = gtk_handle_box_new();
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), handlebox, FALSE, FALSE, 5);
toolbar = gtk_toolbar_new();
gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
gtk_container_set_border_width(GTK_CONTAINER(toolbar), 5);
gtk_toolbar_insert_space(GTK_TOOLBAR(toolbar), 5);
gtk_container_add(GTK_CONTAINER(handlebox), toolbar);
iconw = gtk_image_new_from_file("gtk.xpm");
close_button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "close",
"closes this app", "Private",
iconw, GTK_SIGNAL_FUNC(delete_event), NULL);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
iconw = gtk_image_new_from_file("gtk.xpm");
icon_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
NULL, "Icon", "Only icons in toolbar","Private",
iconw, GTK_SIGNAL_FUNC(radio_event), toolbar);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
iconw = gtk_image_new_from_file("gtk.xpm");
text_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
icon_button, "Text", "Only texts in toolbar","Private",
iconw, GTK_SIGNAL_FUNC(radio_event), toolbar);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
iconw = gtk_image_new_from_file("gtk.xpm");
both_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
text_button, "Both", "Icons and text in toolbar","Private",
iconw, GTK_SIGNAL_FUNC(radio_event), toolbar);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(both_button), TRUE);
iconw = gtk_image_new_from_file("gtk.xpm");
tooltips_button = gtk_toolbar_append_element(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_CHILD_TOGGLEBUTTON,
NULL, "Tooltips", "Toolbar with or without tips","Private",
iconw, GTK_SIGNAL_FUNC(toggle_event), toolbar);
gtk_toolbar_append_space(GTK_TOOLBAR(toolbar));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tooltips_button), TRUE);
entry = gtk_entry_new();
gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), entry, "This is just an entry", "Private");
gtk_widget_show(entry);
gtk_widget_show(toolbar);
gtk_widget_show(handlebox);
gtk_widget_show(dialog);
gtk_main();
return 0;
}
/* gtk.xpm */
static char * gtk_xpm[] = {
"32 39 5 1",
". c none",
"+ c black",
"@ c #3070E0",
"# c #F05050",
"$ c #35E035",
"................+...............",
"..............+++++.............",
"............+++++@@++...........",
"..........+++++@@@@@@++.........",
"........++++@@@@@@@@@@++........",
"......++++@@++++++++@@@++.......",
".....+++@@@+++++++++++@@@++.....",
"...+++@@@@+++@@@@@@++++@@@@+....",
"..+++@@@@+++@@@@@@@@+++@@@@@++..",
".++@@@@@@+++@@@@@@@@@@@@@@@@@@++",
".+#+@@@@@@++@@@@+++@@@@@@@@@@@@+",
".+##++@@@@+++@@@+++++@@@@@@@@$@.",
".+###++@@@@+++@@@+++@@@@@++$$$@.",
".+####+++@@@+++++++@@@@@+@$$$$@.",
".+#####+++@@@@+++@@@@++@$$$$$$+.",
".+######++++@@@@@@@++@$$$$$$$$+.",
".+#######+##+@@@@+++$$$$$$@@$$+.",
".+###+++##+##+@@++@$$$$$$++$$$+.",
".+###++++##+##+@@$$$$$$$@+@$$@+.",
".+###++++++#+++@$$@+@$$@++$$$@+.",
".+####+++++++#++$$@+@$$++$$$$+..",
".++####++++++#++$$@+@$++@$$$$+..",
".+#####+++++##++$$++@+++$$$$$+..",
".++####+++##+#++$$+++++@$$$$$+..",
".++####+++####++$$++++++@$$$@+..",
".+#####++#####++$$+++@++++@$@+..",
".+#####++#####++$$++@$$@+++$@@..",
".++####++#####++$$++$$$$$+@$@++.",
".++####++#####++$$++$$$$$$$$+++.",
".+++####+#####++$$++$$$$$$$@+++.",
"..+++#########+@$$+@$$$$$$+++...",
"...+++########+@$$$$$$$$@+++....",
".....+++######+@$$$$$$$+++......",
"......+++#####+@$$$$$@++........",
".......+++####+@$$$$+++.........",
".........++###+$$$@++...........",
"..........++##+$@+++............",
"...........+++++++..............",
".............++++..............."};
编译命令:
gcc -Wall -g toolbar.c -o toolbar `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`
NoteBooks
NoteBooks widget是一个“page"的集合。这些“pages”的内容会相互覆盖,每次只能查看一个“pages”的内容。
下面距离说明其用法。
程序运行结果:
/*notebook.c*/
#include<stdio.h>
#include<gtk/gtk.h>
static void roate_book(GtkButton *button, GtkNotebook *notebook)
{
gtk_notebook_set_tab_pos(notebook, (notebook->tab_pos + 1) % 4);
}
static void tabsborder_book(GtkButton *button, GtkNotebook *notebook)
{
gint tval = FALSE;
gint bval = FALSE;
if(notebook->show_tabs == 0)
tval = TRUE;
if(notebook->show_border == 0)
bval = TRUE;
gtk_notebook_set_show_tabs(notebook, tval);
gtk_notebook_set_show_border(notebook, bval);
}
static void remove_book(GtkButton *button, GtkNotebook *notebook)
{
gint page;
page = gtk_notebook_get_current_page(notebook);
gtk_notebook_remove_page(notebook, page);
gtk_widget_queue_draw(GTK_WIDGET(notebook));
}
static gboolean delete(GtkWidget *widget, GtkWidget *event, gpointer data)
{
gtk_main_quit();
return FALSE;
}
int main( int argc,
char *argv[] )
{
GtkWidget *window;
GtkWidget *button;
GtkWidget *table;
GtkWidget *notebook;
GtkWidget *frame;
GtkWidget *label;
GtkWidget *checkbutton;
int i;
char bufferf[32];
char bufferl[32];
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
table = gtk_table_new (2, 6, FALSE);
gtk_container_add (GTK_CONTAINER (window), table);
/* Create a new notebook, place the position of the tabs */
notebook = gtk_notebook_new ();
gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
gtk_table_attach_defaults (GTK_TABLE (table), notebook, 0, 6, 0, 1);
gtk_widget_show (notebook);
/* Let's append a bunch of pages to the notebook */
for (i = 0; i < 5; i++) {
sprintf(bufferf, "Append Frame %d", i + 1);
sprintf(bufferl, "Page %d", i + 1);
frame = gtk_frame_new (bufferf);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_widget_set_size_request (frame, 100, 75);
gtk_widget_show (frame);
label = gtk_label_new (bufferf);
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_show (label);
label = gtk_label_new (bufferl);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);
}
/* Now let's add a page to a specific spot */
checkbutton = gtk_check_button_new_with_label ("Check me please!");
gtk_widget_set_size_request (checkbutton, 100, 75);
gtk_widget_show (checkbutton);
label = gtk_label_new ("Add page");
gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), checkbutton, label, 2);
/* Now finally let's prepend pages to the notebook */
for (i = 0; i < 5; i++) {
sprintf (bufferf, "Prepend Frame %d", i + 1);
sprintf (bufferl, "PPage %d", i + 1);
frame = gtk_frame_new (bufferf);
gtk_container_set_border_width (GTK_CONTAINER (frame), 10);
gtk_widget_set_size_request (frame, 100, 75);
gtk_widget_show (frame);
label = gtk_label_new (bufferf);
gtk_container_add (GTK_CONTAINER (frame), label);
gtk_widget_show (label);
label = gtk_label_new (bufferl);
gtk_notebook_prepend_page (GTK_NOTEBOOK (notebook), frame, label);
}
/* Set what page to start at (page 4) */
gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 3);
/* Create a bunch of buttons */
button = gtk_button_new_with_label ("close");
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (delete), NULL);
gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("next page");
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_notebook_next_page),
G_OBJECT (notebook));
gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("prev page");
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_notebook_prev_page),
G_OBJECT (notebook));
gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("tab position");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (roate_book),
(gpointer) notebook);
gtk_table_attach_defaults (GTK_TABLE (table), button, 3, 4, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("tabs/border on/off");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (tabsborder_book),
(gpointer) notebook);
gtk_table_attach_defaults (GTK_TABLE (table), button, 4, 5, 1, 2);
gtk_widget_show (button);
button = gtk_button_new_with_label ("remove page");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (remove_book),
(gpointer) notebook);
gtk_table_attach_defaults (GTK_TABLE (table), button, 5, 6, 1, 2);
gtk_widget_show (button);
gtk_widget_show (table);
gtk_widget_show (window);
gtk_main ();
return 0;
}
编译命令:
gcc -Wall -g notebook.c -o notebook `pkg-config --cflags gtk+-2.0 pkg-config --libs gtk+-2.0`