### 框架(Frames)
框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签。标签的位置和盒子的风格可以灵活改变。在UI设置中,使用框架还是比较多的,也比较简单。看下面的示例代码吧!
### ![](https://box.kancloud.cn/2016-08-24_57bd7799cc92a.jpg)
~~~
/*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)差不多,除了它还会使子构件的外观比例(也就是宽和长的比例)保持一定值,如果需要,还会在构件中增加额外的可用空间。这很有用,例如想 预览一个大的图片。当用户改变窗口的尺寸时,预览器的尺寸应该随之改变,但是外观比例要与原来图片的尺寸保持一致。
![](https://box.kancloud.cn/2016-08-24_57bd7799e3c48.jpg)
~~~
/*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)。
![](https://box.kancloud.cn/2016-08-24_57bd779a03015.jpg)
~~~
/*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;
}
~~~