我想做一种特殊的静态进度条,有颜色的部分标置着某种状态, 找了很长时间,也没找到做工程进度条相关的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;
}
#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;
}