GTK编程基础-----滚动窗口

滚动窗口 Scrolled Windows

滚动窗口(Scrolled windows)用于创建一个可滚动区域,并将其它构件放入其中。可以在滚动窗口中插入任何其它构件,在其内部的构件不论尺寸大小都可以通过滚动条访问到。下面是简单的实例:

/*File:scrlled_windows.c
 *Date:2014-02-10
 *Author:sjin
 *Mail:413977243@qq.com
 */

#include <gtk/gtk.h>
#include <stdio.h>

int main( int   argc, char *argv[] )
{
    /* GtkWidget 是构件的存储类型 */
    GtkWidget *window;
    GtkWidget *scrlled_window;
    GtkWidget *table;
    GtkWidget *button;
    GtkWidget *box;
    char buffer[32];
    int i,j;
    
    /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
    gtk_init (&argc, &argv);
        /* 创建一个新窗口 */
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

    /*设置窗口标题*/
    gtk_window_set_title(GTK_WINDOW(window),"Scrolled Windows 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);

    /*创建一个滚动窗口*/
    scrlled_window = gtk_scrolled_window_new(NULL,NULL);
    gtk_container_set_border_width(GTK_CONTAINER(scrlled_window),10);

    /*滚动条的出现方式:
     *    GTK_POLICY_AUTOMATIC:自动决定是否需要出现滚动条
     *    GTK_POLICY_ALWAYS:一直显示滚动条
     * */
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrlled_window),
                                   GTK_POLICY_AUTOMATIC,GTK_POLICY_ALWAYS);

    /*创建一个纵向盒子来组装控件*/
    
    box = gtk_vbox_new(TRUE,10);
    /*对话框矿口内部包含一个VBOX控件*/
    gtk_box_pack_start(GTK_BOX(box),scrlled_window,TRUE,TRUE,0);
    gtk_widget_show(scrlled_window);
    gtk_container_add(GTK_CONTAINER(window),box);
    /*创建一个包含10X10的表格*/
    table = gtk_table_new(10,10,FALSE);

    /*设置X Y 方向的行间间距为10像素*/
    gtk_table_set_row_spacings(GTK_TABLE(table),10);
    gtk_table_set_col_spacings(GTK_TABLE(table),10);

    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrlled_window),table);
    gtk_widget_show(table);

    for(i = 0; i < 10; i++){
        for(j = 0; j < 10; j++){
            sprintf(buffer,"button(%d,%d)\n",i,j);
            button = gtk_toggle_button_new_with_label(buffer);
            gtk_table_attach_defaults(GTK_TABLE(table),button,i,i+1,j,j+1);
            gtk_widget_show(button);
        }
    }

    /*在对话框的底部添加一个“close”按钮*/
    button = gtk_button_new_with_label("close");
    g_signal_connect_swapped(G_OBJECT(button),"clicked",G_CALLBACK(gtk_main_quit),window);

    /*此按钮被缺省*/
    GTK_WIDGET_SET_FLAGS(button,GTK_CAN_DEFAULT);
    gtk_box_pack_start(GTK_BOX(box),button,TRUE,TRUE,0);

    gtk_widget_show(box);

    /*按钮固定为缺省按钮,只要按回车键就相当于点击这个按钮*/
    gtk_widget_grab_default(button);
    gtk_widget_show(button);

    gtk_widget_show(window);

     /* 等待事件 (如键盘事件或鼠标事件) 的发生。*/
    gtk_main ();
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值