GTK编程基础-----框架、比例框架、分栏窗口构件

框架(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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值