笔记本控件,可以让用户标签式地切换多个界面。当我们需要多窗口切换时,使用笔记本控件是一个明智的选择。

25_笔记本控件 - 图1

笔记本控件的创建:

GtkWidget *gtk_notebook_new(void);

返回值:笔记本控件指针

设置页标签的位置:

void gtk_notebook_set_tab_pos( GtkNotebook *notebook,
                                GtkPositionType pos );

notebook:笔记本控件
pos取值如下:
GTK_POS_LEFT: 左
GTK_POS_RIGHT: 右
GTK_POS_TOP: 上
GTK_POS_BOTTOM: 下

追加页面:

gint gtk_notebook_append_page( GtkNotebook *notebook,
                                GtkWidget *child,
                                GtkWidget *tab_label );

notebook: 容纳别的控件的笔记本
child: 放在笔记本页面里的子控件
tab_label:要添加页面的标题名
返回值:成功返回值页面值(从0开始),失败返回-1

在指定位置添加页面(从0开始):

gint gtk_notebook_insert_page( GtkNotebook *notebook,
                                GtkWidget *child,
                                GtkWidget *tab_label,
                                gint position );

notebook: 容纳别的控件的笔记本
child: 放在笔记本页面里的子控件
tab_label:要添加页面的标题名
position:页面的位置,从0开始,如果-1代表添加到最后
返回值:成功返回值页面值(从0开始),失败返回-1

设置起始页,从0开始算,相当于设置第几个页面显示:

void gtk_notebook_set_current_page(GtkNotebook *notebook,
                                    gint page_num );

notebook:要设置的笔记本控件
page_num:页面数

常用信号:”switch-page”
当切换页面时,会触发”switch-page”信号

例子代码如下:

#include <gtk/gtk.h>

// "switch-page"信号处理函数,page_num指第几个页面,从0开始
void deal_switch_pape(GtkNotebook *notebook, gpointer page,
                guint page_num, gpointer user_data)
{
    printf("我是第%d个页面\n", page_num+1);
}

int main( int argc, char *argv[] ) 
{ 
    gtk_init (&argc, &argv);     // 初始化

    GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); // 创建主窗口
    gtk_widget_set_size_request(window, 400, 300);    //设置窗口大小

    GtkWidget *notebook = gtk_notebook_new();     // 创建笔记本控件
    gtk_container_add(GTK_CONTAINER(window), notebook); // 笔记本放进窗口

    // 页标签的位置,可以有四种位置:上、下、左或右。
    gtk_notebook_set_tab_pos(GTK_NOTEBOOK (notebook), GTK_POS_TOP);  //上面


    // 第一个页面
    GtkWidget *label = gtk_label_new("Page one");    //创建标签
    GtkWidget *box = gtk_hbox_new(TRUE, 5);    // 创建布局
    GtkWidget *button_one = gtk_button_new_with_label("我是第一个页面");
    GtkWidget *button_two = gtk_button_new_with_label("我是第一个页面的按钮");
    gtk_container_add(GTK_CONTAINER(box), button_one);
    gtk_container_add(GTK_CONTAINER(box), button_two);

    /* gtk_notebook_append_page( GtkNotebook *notebook, GtkWidget *child, 
     *                     GtkWidget  *tab_label );
     * 插入页面到笔记本的后端(append)或前端(prepend)来添加页面。
     * child是放在笔记本页面里的子控件,它必须另外创建,一般是容器
     * tab_label是要添加的页面的标签。
     */
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box, label); 

    // 第二个页面
    label = gtk_label_new("Page two");    //创建标签
    box = gtk_hbox_new(TRUE, 5);    // 创建布局
    button_one = gtk_button_new_with_label("我是第二个页面");
    button_two = gtk_button_new_with_label("我是第二个页面的按钮");
    gtk_container_add(GTK_CONTAINER(box), button_one);
    gtk_container_add(GTK_CONTAINER(box), button_two);
    gtk_notebook_append_page(GTK_NOTEBOOK(notebook), box, label); 

    // 第三个页面,在指定位置添加页面,从0开始
    button_one = gtk_button_new_with_label("我是通过insert_page实现的,第三个页面");
    label = gtk_label_new("Page three"); 
    gtk_notebook_insert_page(GTK_NOTEBOOK(notebook), button_one, label, 2); 

    // 处理信号,当切换页面时,会触发"switch-page"信号
    g_signal_connect(notebook, "switch-page",
                    G_CALLBACK(deal_switch_pape), NULL);

    gtk_widget_show_all(window); //显示所有控件

    // 设置起始页(第2页),从0开始算,相当于设置第2个页面显示
    gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 1); 

    gtk_main();         // 主事件循环

    return 0; 
} 

程序运行效果图如下:

25_笔记本控件 - 图2