用GtkTreeView做进度条

   我想做一种特殊的静态进度条,有颜色的部分标置着某种状态,    找了很长时间,也没找到做工程进度条相关的gtk代码,不过有人说了,用GtkTreeView可以做像Excel之类的表格,于是摸索了不少时间,原来,GtkTreeeView可以渲染文字,图片和toggleButton.下面实现的是进度条,对图片进行处理之后即可渲染达到效果。
 
#include <stdlib.h>
#include <gtk/gtk.h>

void FillColor(GdkPixbuf *pixbuf, gint xstart, gint xstop, gint color)
{
    if (pixbuf == NULL || xstart < 0 || xstart < 0)
           return;
    gint channel;
    gint rowstride;
    gint w;
    gint h;
    guchar  *pixel;
    guchar *p;
    gint x;
    gint y;

    channel = gdk_pixbuf_get_n_channels(pixbuf);
    rowstride = gdk_pixbuf_get_rowstride(pixbuf);
     w =  gdk_pixbuf_get_width(pixbuf);
     h = gdk_pixbuf_get_height(pixbuf);

     if (w < xstop)  xstop = w;

     pixel = gdk_pixbuf_get_pixels(pixbuf);
     p = gdk_pixbuf_get_pixels(pixbuf);

     for(y = 0; y < h; ++y)
     for(x = xstart; x < xstop; ++x)
     {
         p = pixel+y*rowstride+x*channel;
         p[0] = (color & 0xff000000) >>24;
         p[1] = (color & 0x00ff0000) >>16;
         p[2] = (color & 0x0000ff00) >>8;
     }
}

GtkTreeModel * GetModel ()
{
  GtkTreeStore *treestore;
  GtkTreeIter iter;
  GdkPixbuf *pixbuf;
  GdkPixbuf *pixbuf2;
  gint i;
  gint total;
  gchar buffer[50];
  total = 5;

  treestore = gtk_tree_store_new(2,G_TYPE_STRING,GDK_TYPE_PIXBUF);
   pixbuf = gdk_pixbuf_new_from_file("bg.png", NULL);
   for (i = 0; i< total; ++i)
   {
      sprintf(buffer, "channel%d", i);
       pixbuf2 =  gdk_pixbuf_scale_simple (pixbuf, 400, 20, GDK_INTERP_BILINEAR );
       FillColor(pixbuf2, i*50, i*50+50, 0x00FFF000);

       gtk_tree_store_append(GTK_TREE_STORE(treestore), &iter, NULL);
       gtk_tree_store_set(GTK_TREE_STORE(treestore),
                       &iter,
                       0, buffer,
                       1, pixbuf2,
                       -1);
        g_object_unref(pixbuf2);
   }

  return GTK_TREE_MODEL(treestore);
}

static GtkWidget *Getview()
{
  GtkWidget *view;
  GtkCellRenderer *renderer;
  GtkTreeModel *model;

  view = gtk_tree_view_new();

  renderer = gtk_cell_renderer_text_new ();
  g_object_set (G_OBJECT (renderer),
                 "foreground", "green",
                 NULL);

 gtk_tree_view_insert_column_with_attributes(
        GTK_TREE_VIEW(view),    //
        -1,
        NULL,
        renderer,"text", 0,
        NULL);

 renderer =  gtk_cell_renderer_pixbuf_new();
 gtk_tree_view_insert_column_with_attributes(
        GTK_TREE_VIEW(view),
        -1,
        NULL,
        renderer,"pixbuf", 1,
        NULL);

  model = GetModel();
  gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);

  g_object_unref(model);
  return view;
}

int main (int argc, char *argv[])
{
  GtkWidget *win = NULL;
  GtkWidget *vbox = NULL;
  GtkWidget *view = NULL;

  /* Initialize GTK+ */
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
  gtk_init (&argc, &argv);
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);

  /* Create the main window */
  win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_container_set_border_width (GTK_CONTAINER (win), 8);
  gtk_window_set_title (GTK_WINDOW (win), "Hello World");
  gtk_widget_set_usize(win, 400, 400);
  gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
   gtk_window_set_resizable(GTK_WINDOW(win), FALSE);
  gtk_widget_realize (win);
  g_signal_connect (win, "destroy", gtk_main_quit, NULL);

  vbox = gtk_vbox_new (TRUE, 6);
  gtk_container_add (GTK_CONTAINER (win), vbox);

  view  = Getview();
  gtk_box_pack_start(GTK_BOX(vbox),view,FALSE,FALSE,0);

  /* Enter the main loop */
  gtk_widget_show_all (win);
  gtk_main ();
  return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值