### 筆記本構件(The NoteBook Widget)
筆記本構件(The NoteBook Widget)是互相重疊的頁面集合,每一頁都包含不同的信息,且一次只有一個頁面是可見的。該構件在GUI(圖形用戶接口)編程中很常用。要顯示大量的相似信息,同時把它們分別顯示時,使用這種構件是一個很好的方法。具體看下面的代碼

具體代碼如下:
~~~
/*File:notebook.c
*Date:2014-0309
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
#include <stdio.h>
/*這個函數旋轉頁標簽的位置*/
void rotate_book(GtkButton *button,GtkNotebook *notebook)
{
gtk_notebook_set_tab_pos(notebook,(notebook->tab_pos + 1) % 4);
}
/*隱藏或顯示頁標簽和邊框*/
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);
}
/*從筆記本構件上刪除頁面*/
void remove_book(GtkButton *button,GtkNotebook *notebook)
{
gint page;
page = gtk_notebook_get_current_page(notebook);
gtk_notebook_remove_page(notebook,page);
/***********
* 必須刷新構件-----這會迫使構件重繪自身*/
gtk_widget_draw(GTK_WIDGET(notebook),NULL);
}
void delete(GtkWidget *widget,GtkWidget *event,gpointer data)
{
gtk_main_quit();
}
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
gtk_init(&argc,&argv);
//創建最上層主窗口
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//連接信號"delete_event",使得窗口關閉時發生
g_signal_connect(G_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete),NULL);
//設置窗口標題
gtk_window_set_title(GTK_WINDOW(window),"notebook 練習");
//設定窗口的默認寬高
//gtk_window_set_default_size(GTK_WINDOW(window),200,300);
//設定窗口的位置,讓窗口總在最前端
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
//設定容器邊框的寬度
gtk_container_set_border_width(GTK_CONTAINER(window),20);
/*表組裝,創建表*/
table = gtk_table_new(3,6,FALSE);
gtk_container_add(GTK_CONTAINER(window),table);
/*創建一個筆記本構件,將標簽頁放在頂部*/
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);
/*向筆記本構件中插入標簽頁*/
for(i = 0; i < 5; i++){
sprintf(bufferf,"筆記本構件框架 %d",i + 1);
sprintf(bufferl,"標簽頁 %d",i + 1);
frame = gtk_frame_new(bufferf);
gtk_container_set_border_width(GTK_CONTAINER(frame),10);
gtk_widget_set_usize(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);
}
/*設置起始頁為第四頁*/
gtk_notebook_set_page(GTK_NOTEBOOK(notebook),3);
/*創建一排按鈕*/
/*關閉*/
button = gtk_button_new_with_label("關閉");
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",GTK_SIGNAL_FUNC(delete),NULL);
gtk_table_attach_defaults(GTK_TABLE(table),button,0,1,1,2);
gtk_widget_show(button);
/*下一頁*/
button = gtk_button_new_with_label("下一頁");
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_notebook_next_page),GTK_NOTEBOOK(notebook));
gtk_table_attach_defaults(GTK_TABLE(table),button,1,2,1,2);
gtk_widget_show(button);
/*上一頁*/
button = gtk_button_new_with_label("上一頁");
gtk_signal_connect_object(GTK_OBJECT(button),"clicked",G_CALLBACK(gtk_notebook_prev_page),GTK_NOTEBOOK(notebook));
gtk_table_attach_defaults(GTK_TABLE(table),button,2,3,1,2);
gtk_widget_show(button);
/*標簽頁位置*/
button = gtk_button_new_with_label("標簽頁位置");
gtk_signal_connect(GTK_OBJECT(button),"clicked",(GtkSignalFunc)rotate_book,GTK_NOTEBOOK(notebook));
gtk_table_attach_defaults(GTK_TABLE(table),button,3,4,1,2);
gtk_widget_show(button);
/*隱藏頁標簽和邊框*/
button = gtk_button_new_with_label("頁標簽和邊框ON、OFF");
gtk_signal_connect(GTK_OBJECT(button),"clicked",(GtkSignalFunc)tabsborder_book,GTK_NOTEBOOK(notebook));
gtk_table_attach_defaults(GTK_TABLE(table),button,4,5,1,2);
gtk_widget_show(button);
/*刪除*/
button = gtk_button_new_with_label("刪除");
gtk_signal_connect(GTK_OBJECT(button),"clicked",(GtkSignalFunc)remove_book,GTK_NOTEBOOK(notebook));
gtk_table_attach_defaults(GTK_TABLE(table),button,5,6,1,2);
gtk_widget_show(button);
gtk_widget_show(table);
gtk_widget_show_all(window);
gtk_main();
return FALSE;
}
~~~