GTK 框架(Frames)

框架(Frames)

框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签。标签的位置和盒子的风格可以灵活改变。在UI设置中,使用框架还是比较多的,也比较简单。看下面的示例代码吧!

GTK 框架(Frames)_第1张图片 

[cpp] view plain copy print ?
  1. /*File:frames.c 
  2.  *Date:2014-02-09 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9.   
  10. int main( int   argc, char *argv[] )  
  11. {  
  12.     /* GtkWidget 是构件的存储类型 */  
  13.     GtkWidget *window;  
  14.     GtkWidget *frames;  
  15.       
  16.     /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/  
  17.     gtk_init (&argc, &argv);  
  18.         /* 创建一个新窗口 */  
  19.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
  20.   
  21.     /*设置窗口标题*/  
  22.     gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");  
  23.      
  24.     /**/  
  25.     gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);  
  26.     /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” 
  27.      * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 
  28.      * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/  
  29.     g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);  
  30.       
  31.     gtk_widget_set_size_request(window,300,300);  
  32.     /*设置窗口的边框宽度*/  
  33.     gtk_container_set_border_width(GTK_CONTAINER(window),5);  
  34.   
  35.     /**/  
  36.     frames = gtk_frame_new(NULL);  
  37.     gtk_container_add(GTK_CONTAINER(window),frames);  
  38.   
  39.     /*设置框架的标签*/  
  40.     gtk_frame_set_label(GTK_FRAME(frames),"GTK Frame widget");  
  41.   
  42.     /*将标签定位在框架的右边*/  
  43.     gtk_frame_set_label_align(GTK_FRAME(frames),1.0,0.0);  
  44.   
  45.     /*设置框架的风格*/  
  46.     gtk_frame_set_shadow_type(GTK_FRAME(frames),GTK_SHADOW_OUT);  
  47.   
  48.     gtk_widget_show(frames);  
  49.   
  50.     gtk_widget_show(window);  
  51.   
  52.      /* 等待事件 (如键盘事件或鼠标事件) 的发生。*/  
  53.     gtk_main ();  
  54.       
  55.     return 0;  
  56. }  

比例框架 (Aspect Frames)

比 例框架构件(The aspect frame widget)和框架构件(frame widget)差不多,除了它还会使子构件的外观比例(也就是宽和长的比例)保持一定值,如果需要,还会在构件中增加额外的可用空间。这很有用,例如想 预览一个大的图片。当用户改变窗口的尺寸时,预览器的尺寸应该随之改变,但是外观比例要与原来图片的尺寸保持一致。
GTK 框架(Frames)_第2张图片
[cpp] view plain copy print ?
  1. /*File:aspectFrame.c 
  2.  *Date:2014-02-09 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8.   
  9.   
  10. int main( int   argc, char *argv[] )  
  11. {  
  12.     /* GtkWidget 是构件的存储类型 */  
  13.     GtkWidget *window;  
  14.     GtkWidget *aspect_frame;  
  15.     GtkWidget *drawing_area;  
  16.       
  17.     /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/  
  18.     gtk_init (&argc, &argv);  
  19.         /* 创建一个新窗口 */  
  20.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
  21.   
  22.     /*设置窗口标题*/  
  23.     gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");  
  24.      
  25.     /**/  
  26.     gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);  
  27.     /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” 
  28.      * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 
  29.      * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/  
  30.     g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);  
  31.       
  32.     gtk_widget_set_size_request(window,300,300);  
  33.     /*设置窗口的边框宽度*/  
  34.     gtk_container_set_border_width(GTK_CONTAINER(window),5);  
  35.   
  36.     /**/  
  37.     aspect_frame = gtk_aspect_frame_new("2x1",/*label*/  
  38.                                         0.5,/*center x*/  
  39.                                         0.5,/*center y*/  
  40.                                         2,/*xsize/ysize = 2*/  
  41.                                         FALSE/*ignore child aspect*/);  
  42.     gtk_container_add(GTK_CONTAINER(window),aspect_frame);  
  43.   
  44.     gtk_widget_show(aspect_frame);  
  45.   
  46.     /*添加个子控件画图板*/  
  47.     drawing_area = gtk_drawing_area_new();  
  48.   
  49.     gtk_widget_set_size_request(drawing_area,200,200);  
  50.     gtk_container_add(GTK_CONTAINER(aspect_frame),drawing_area);  
  51.     gtk_widget_show(drawing_area);  
  52.   
  53.     gtk_widget_show(window);  
  54.   
  55.      /* 等待事件 (如键盘事件或鼠标事件) 的发生。*/  
  56.     gtk_main ();  
  57.       
  58.     return 0;  
  59. }  


分栏窗口构件 Paned Window Widgets

如 果想要将一个窗口分成两个部分,可以使用分栏窗口构件(The paned window widgets)。窗口两部分的尺寸由用户控制,它们之间有一个凹槽,上面有一个手柄,用户可以拖动此手柄改变两部分的比例。窗口划分可以是水平 (HPaned)或垂直的(VPaned)。
GTK 框架(Frames)_第3张图片
[cpp] view plain copy print ?
  1. /*File:panedWindowWidget.c 
  2.  *Date:2014-02-09 
  3.  *Author:sjin 
  4.  *Mail:[email protected] 
  5.  */  
  6.   
  7. #include <gtk/gtk.h>  
  8. #include <stdio.h>  
  9.   
  10. /*创建一个消息的列表*/  
  11.   
  12. GtkWidget *create_list(void)  
  13. {  
  14.     GtkWidget *scrolled_window;  
  15.     GtkWidget *tree_view;  
  16.     GtkListStore *model;  
  17.     GtkTreeIter iter;  
  18.     GtkCellRenderer *cell;  
  19.     GtkTreeViewColumn *column;  
  20.   
  21.     int i;  
  22.   
  23.     /*创建一个新的滚动窗口,只有需要时,滚动条才会出现*/  
  24.     scrolled_window = gtk_scrolled_window_new(NULL,NULL);  
  25.     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),  
  26.                                    GTK_POLICY_AUTOMATIC,  
  27.                                    GTK_POLICY_AUTOMATIC);  
  28.   
  29.     model = gtk_list_store_new(1,G_TYPE_STRING);  
  30.     tree_view = gtk_tree_view_new();  
  31.     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),tree_view);  
  32.     gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view),GTK_TREE_MODEL(model));  
  33.     gtk_widget_show(tree_view);  
  34.   
  35.     /*在窗口添加一些消息*/  
  36.     for(i = 0;  i < 10; i++){  
  37.   
  38.         gchar *msg = g_strdup_printf("Message #%d.",i);  
  39.         gtk_list_store_append(GTK_LIST_STORE(model),&iter);  
  40.         gtk_list_store_set(GTK_LIST_STORE(model),&iter,0,msg,-1);  
  41.         g_free(msg);  
  42.     }  
  43.   
  44.     /*创建列的代表*/  
  45.     cell = gtk_cell_renderer_text_new();  
  46.     column = gtk_tree_view_column_new_with_attributes("Message",cell,"text",0,NULL);  
  47.     gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view),GTK_TREE_VIEW_COLUMN(column));  
  48.   
  49.     gtk_widget_set_size_request(scrolled_window,300,150);  
  50.     return scrolled_window;  
  51. }  
  52.   
  53. /*向文本构件中添加一些文本- 这是当窗口被实例化时调用的回调函数*/  
  54.   
  55. void insert_text(GtkTextBuffer *buffer)  
  56. {  
  57.     GtkTextIter iter;  
  58.   
  59.     /*偏移到文本构件的开头*/  
  60.     gtk_text_buffer_get_iter_at_offset(buffer,&iter,0);  
  61.   
  62.     gtk_text_buffer_insert(buffer,&iter,  
  63.                            "From:[email protected]\n"  
  64.                            "To:[email protected]\n"  
  65.                            "Subject:I Miss You!\n"  
  66.                            "\n"  
  67.                            "These days have been think you,\nsee you on the QQ no information\n"  
  68.                            "are inexplicable pain in my heart,\ncan not let go!\n"  
  69.                            "                   love you 阿辉\n",  
  70.                            -1);  
  71. }  
  72.   
  73. /*创建一个滚动的文本区域,用于显示一个信息*/  
  74. GtkWidget *create_text(void)  
  75. {  
  76.     GtkWidget *scrolled_window;  
  77.     GtkWidget *view;  
  78.     GtkTextBuffer *buffer;  
  79.   
  80.     view = gtk_text_view_new();  
  81.     buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view));  
  82.   
  83.     scrolled_window = gtk_scrolled_window_new(NULL,NULL);  
  84.     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),  
  85.                                    GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);  
  86.   
  87.     gtk_container_add(GTK_CONTAINER(scrolled_window),view);  
  88.     insert_text(buffer);  
  89.   
  90.     gtk_widget_show_all(scrolled_window);  
  91.   
  92.     return scrolled_window;  
  93. }  
  94.   
  95. int main( int   argc, char *argv[] )  
  96. {  
  97.     /* GtkWidget 是构件的存储类型 */  
  98.     GtkWidget *window;  
  99.     GtkWidget *vpaned;  
  100.     GtkWidget *list;  
  101.     GtkWidget *text;  
  102.       
  103.     /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/  
  104.     gtk_init (&argc, &argv);  
  105.         /* 创建一个新窗口 */  
  106.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
  107.   
  108.     /*设置窗口标题*/  
  109.     gtk_window_set_title(GTK_WINDOW(window),"Frame Example!");  
  110.      
  111.     /**/  
  112.     gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);  
  113.     /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” 
  114.      * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 destroy_window() 函数。 
  115.      * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/  
  116.     g_signal_connect (GTK_OBJECT(window), "destroy",G_CALLBACK (gtk_main_quit), NULL);  
  117.       
  118.     gtk_widget_set_size_request(window,300,300);  
  119.     /*设置窗口的边框宽度*/  
  120.     gtk_container_set_border_width(GTK_CONTAINER(window),10);  
  121.   
  122.     /*在顶级窗口上添加一个垂直分栏窗口构件*/  
  123.     vpaned = gtk_vpaned_new();  
  124.     gtk_container_add(GTK_CONTAINER(window),vpaned);  
  125.     gtk_widget_show(vpaned);  
  126.   
  127.     /*在分栏窗口的两部分各添加一些构件*/  
  128.     list = create_list();  
  129.     gtk_paned_add1(GTK_PANED(vpaned),list);  
  130.     gtk_widget_show(list);  
  131.   
  132.     text = create_text();  
  133.     gtk_paned_add2(GTK_PANED(vpaned),text);  
  134.     gtk_widget_show(text);  
  135.   
  136.     gtk_widget_show(window);  
  137.   
  138.      /* 等待事件 (如键盘事件或鼠标事件) 的发生。*/  
  139.     gtk_main ();  
  140.       
  141.     return 0;  

你可能感兴趣的:(GTK 框架(Frames))