GTK tutorial 十

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` 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值