Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36991
  • 博文数量: 10
  • 博客积分: 3180
  • 博客等级: 中校
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-18 22:00
文章分类
文章存档

2011年(5)

2010年(5)

分类:

2010-03-18 22:00:37

2010-03-08
 
一直想选一个跨平台的gui图形库研究下去,选来选去。决定使用gtk+,觉得她简单,编程风格好,又是主流开源界面库,非常直接了当。

出于数据库应用的需要,需要一个基本的grid控件,用gtk实现还是比较容易,下面是个简单例子

说明:我是在windows xp下用vs2008下编写代码,使用gtk+ 2.18.7win32平台库编译,linux编译也成功,代码跨平台,呵呵。

#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#include "gtk/gtk.h"


enum { BUY_IT = 0 , QUANTITY , PRODUCT , COLUMNS};

typedef struct
{
    gboolean buy;
    gint quantity;
    gchar *product;
} GroceryItem;

const GroceryItem list[] =
{
    { TRUE,  1, "汤圆"},
    { TRUE,  2, "面包"},
    { FALSE,  1, "奶油"},
    { TRUE,  1, "牛奶"},
    { FALSE,  3, "Chips"},
    { TRUE,  4, "Soda1"},
    { TRUE,  5, "Soda2"},
    { TRUE,  6, "Soda3"},
    { TRUE,  7, "Soda4"},
    { TRUE,  8, "Soda5"},
    { FALSE,  0, NULL}
};

static  void setup_tree_view(GtkWidget *treeview)
{   

    //这里在treeview中加入三列标题头
    GtkCellRenderer *renderer=0;
    GtkTreeViewColumn *column=0;      

    renderer = gtk_cell_renderer_text_new();   
    column = gtk_tree_view_column_new_with_attributes("Buy", renderer, "text", BUY_IT, NULL);
    gtk_tree_view_column_set_resizable (column,TRUE);
    gtk_tree_view_column_set_alignment (column,0.5);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);   

    renderer = gtk_cell_renderer_text_new();   
    column = gtk_tree_view_column_new_with_attributes("Count", renderer, "text", QUANTITY, NULL);   
    gtk_tree_view_column_set_resizable (column,TRUE);
    gtk_tree_view_column_set_alignment (column,0.5);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);   

    renderer = gtk_cell_renderer_text_new();   
    column = gtk_tree_view_column_new_with_attributes("Product", renderer, "text", PRODUCT, NULL);
    gtk_tree_view_column_set_resizable (column,TRUE);
    gtk_tree_view_column_set_alignment (column,0.5);
    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
}

int main(int argc,char*argv[])
{
    GtkWidget *window, *treeview, *scrolled_win;
    GtkListStore *store;
    GtkTreeIter iter;
    guint i = 0;

    gtk_init(&argc, &argv);
   
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   
    //设定系统windows框的标题
    gtk_window_set_title(GTK_WINDOW(window), g_locale_to_utf8("中文Gtkgrid",-1,0,0,0));
   
    //设定window与系统windows之间的一个间隙为2
    gtk_container_set_border_width(GTK_CONTAINER(window), 2);
   
    //设定总框容器大小
    gtk_widget_set_size_request(window, 300, 200);
   
    //生成一个treeview
    treeview = gtk_tree_view_new();
    //网格线属性设置,横竖都画
    gtk_tree_view_set_grid_lines(GTK_TREE_VIEW(treeview),GTK_TREE_VIEW_GRID_LINES_BOTH);
   
    //生成列标题
    setup_tree_view(treeview);
   
    //设定每行的字段属性
    store = gtk_list_store_new(COLUMNS, G_TYPE_BOOLEAN, G_TYPE_INT, G_TYPE_STRING);

    while (list[i].product != NULL)
    {
        //插入一个空行
        gtk_list_store_append(store, &iter);
        //填写行内容
        gtk_list_store_set(store, &iter, BUY_IT, list[i].buy,QUANTITY,list[i].quantity,PRODUCT,g_locale_to_utf8(list[i].product,-1,0,0,0), -1);
        i++;
    }    
   
    gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));
   
    g_object_unref(store);
   
    //生成滚动窗口容器
    scrolled_win = gtk_scrolled_window_new(NULL,  NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    //将treeview放入滚动窗口容器
    gtk_container_add(GTK_CONTAINER(scrolled_win), treeview);
    //将滚动窗口放入主窗口容器
    gtk_container_add(GTK_CONTAINER(window), scrolled_win);
   
    gtk_widget_show_all(window);

    gtk_main();

    return 0;
}


下面是效果图:



阅读(1931) | 评论(0) | 转发(0) |
0

上一篇:说说胡话

下一篇:ACE中的ACE_Task框架

给主人留下些什么吧!~~