框架、比例框架、分栏窗口构件

最后更新于:2022-04-01 20:22:12

### 框架(Frames) 框架(Frames)可以用于在盒子中封装一个或一组构件,框架本身还可以有一个标签。标签的位置和盒子的风格可以灵活改变。在UI设置中,使用框架还是比较多的,也比较简单。看下面的示例代码吧! ### ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-24_57bd7799cc92a.jpg) ~~~ /*File:frames.c *Date:2014-02-09 *Author:sjin *Mail:413977243@qq.com */ #include 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://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-24_57bd7799e3c48.jpg) ~~~ /*File:aspectFrame.c *Date:2014-02-09 *Author:sjin *Mail:413977243@qq.com */ #include 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://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-24_57bd779a03015.jpg) ~~~ /*File:panedWindowWidget.c *Date:2014-02-09 *Author:sjin *Mail:413977243@qq.com */ #include #include /*创建一个消息的列表*/ 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; } ~~~
';