### 框架(Frames)
框架(Frames)可以用于在盒子中封裝一個或一組構件,框架本身還可以有一個標簽。標簽的位置和盒子的風格可以靈活改變。在UI設置中,使用框架還是比較多的,也比較簡單。看下面的示例代碼吧!
### 
~~~
/*File:frames.c
*Date:2014-02-09
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
int main( int argc, char *argv[] )
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *window;
GtkWidget *frames;
/* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/
gtk_init (&argc, &argv);
/* 創建一個新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");
/**/
gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);
/* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉”
* 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 destroy_window() 函數。
* 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/
g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_set_size_request(window,300,300);
/*設置窗口的邊框寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),5);
/**/
frames = gtk_frame_new(NULL);
gtk_container_add(GTK_CONTAINER(window),frames);
/*設置框架的標簽*/
gtk_frame_set_label(GTK_FRAME(frames),"GTK Frame widget");
/*將標簽定位在框架的右邊*/
gtk_frame_set_label_align(GTK_FRAME(frames),1.0,0.0);
/*設置框架的風格*/
gtk_frame_set_shadow_type(GTK_FRAME(frames),GTK_SHADOW_OUT);
gtk_widget_show(frames);
gtk_widget_show(window);
/* 等待事件 (如鍵盤事件或鼠標事件) 的發生。*/
gtk_main ();
return 0;
}
~~~
###
### 比例框架 (Aspect Frames)
比 例框架構件(The aspect frame widget)和框架構件(frame widget)差不多,除了它還會使子構件的外觀比例(也就是寬和長的比例)保持一定值,如果需要,還會在構件中增加額外的可用空間。這很有用,例如想 預覽一個大的圖片。當用戶改變窗口的尺寸時,預覽器的尺寸應該隨之改變,但是外觀比例要與原來圖片的尺寸保持一致。

~~~
/*File:aspectFrame.c
*Date:2014-02-09
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
int main( int argc, char *argv[] )
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *window;
GtkWidget *aspect_frame;
GtkWidget *drawing_area;
/* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/
gtk_init (&argc, &argv);
/* 創建一個新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");
/**/
gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);
/* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉”
* 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 destroy_window() 函數。
* 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/
g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_set_size_request(window,300,300);
/*設置窗口的邊框寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),5);
/**/
aspect_frame = gtk_aspect_frame_new("2x1",/*label*/
0.5,/*center x*/
0.5,/*center y*/
2,/*xsize/ysize = 2*/
FALSE/*ignore child aspect*/);
gtk_container_add(GTK_CONTAINER(window),aspect_frame);
gtk_widget_show(aspect_frame);
/*添加個子控件畫圖板*/
drawing_area = gtk_drawing_area_new();
gtk_widget_set_size_request(drawing_area,200,200);
gtk_container_add(GTK_CONTAINER(aspect_frame),drawing_area);
gtk_widget_show(drawing_area);
gtk_widget_show(window);
/* 等待事件 (如鍵盤事件或鼠標事件) 的發生。*/
gtk_main ();
return 0;
}
~~~
###
### 分欄窗口構件 Paned Window Widgets
如 果想要將一個窗口分成兩個部分,可以使用分欄窗口構件(The paned window widgets)。窗口兩部分的尺寸由用戶控制,它們之間有一個凹槽,上面有一個手柄,用戶可以拖動此手柄改變兩部分的比例。窗口劃分可以是水平 (HPaned)或垂直的(VPaned)。

~~~
/*File:panedWindowWidget.c
*Date:2014-02-09
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
#include <stdio.h>
/*創建一個消息的列表*/
GtkWidget *create_list(void)
{
GtkWidget *scrolled_window;
GtkWidget *tree_view;
GtkListStore *model;
GtkTreeIter iter;
GtkCellRenderer *cell;
GtkTreeViewColumn *column;
int i;
/*創建一個新的滾動窗口,只有需要時,滾動條才會出現*/
scrolled_window = gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
model = gtk_list_store_new(1,G_TYPE_STRING);
tree_view = gtk_tree_view_new();
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),tree_view);
gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view),GTK_TREE_MODEL(model));
gtk_widget_show(tree_view);
/*在窗口添加一些消息*/
for(i = 0; i < 10; i++){
gchar *msg = g_strdup_printf("Message #%d.",i);
gtk_list_store_append(GTK_LIST_STORE(model),&iter);
gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,msg,-1);
g_free(msg);
}
/*創建列的代表*/
cell = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Message",cell,"text",0,NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view),GTK_TREE_VIEW_COLUMN(column));
gtk_widget_set_size_request(scrolled_window,300,150);
return scrolled_window;
}
/*向文本構件中添加一些文本- 這是當窗口被實例化時調用的回調函數*/
void insert_text(GtkTextBuffer *buffer)
{
GtkTextIter iter;
/*偏移到文本構件的開頭*/
gtk_text_buffer_get_iter_at_offset(buffer,&iter,0);
gtk_text_buffer_insert(buffer,&iter,
"From:jsh@163.com\n"
"To:413977243@qq.com\n"
"Subject:I Miss You!\n"
"\n"
"These days have been think you,\nsee you on the QQ no information\n"
"are inexplicable pain in my heart,\ncan not let go!\n"
" love you 阿輝\n",
-1);
}
/*創建一個滾動的文本區域,用于顯示一個信息*/
GtkWidget *create_text(void)
{
GtkWidget *scrolled_window;
GtkWidget *view;
GtkTextBuffer *buffer;
view = gtk_text_view_new();
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));
scrolled_window = gtk_scrolled_window_new(NULL,NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrolled_window),view);
insert_text(buffer);
gtk_widget_show_all(scrolled_window);
return scrolled_window;
}
int main( int argc, char *argv[] )
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *window;
GtkWidget *vpaned;
GtkWidget *list;
GtkWidget *text;
/* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/
gtk_init (&argc, &argv);
/* 創建一個新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");
/**/
gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);
/* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉”
* 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 destroy_window() 函數。
* 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/
g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_set_size_request(window,300,300);
/*設置窗口的邊框寬度*/
gtk_container_set_border_width(GTK_CONTAINER(window),10);
/*在頂級窗口上添加一個垂直分欄窗口構件*/
vpaned = gtk_vpaned_new();
gtk_container_add(GTK_CONTAINER(window),vpaned);
gtk_widget_show(vpaned);
/*在分欄窗口的兩部分各添加一些構件*/
list = create_list();
gtk_paned_add1(GTK_PANED(vpaned),list);
gtk_widget_show(list);
text = create_text();
gtk_paned_add2(GTK_PANED(vpaned),text);
gtk_widget_show(text);
gtk_widget_show(window);
/* 等待事件 (如鍵盤事件或鼠標事件) 的發生。*/
gtk_main ();
return 0;
}
~~~