一、简介
Gtk+2.0在提示对话框中,通过带图标的按钮显示不同的提示信息。
GTK+中的GDKPIXBUF库是专门用来处理图像的,它支持多种图像格式和动画,如常见的TIFF、JPEG、PNG、GIF等图像格式。使用gdk-pixbuf-csource命令将图像转化为C语言的头文件,可以免除程序运行时找不到图像的烦恼。
二、详解
1、处理图像
(1)gdk-pixbuf-csource是GTK+2.0中提供的一个将图像文件转换成GdkPixbufs结构格式的C源代码工具,参数:--raw表示禁止生成的图像数据保持运行时的长度,--name表示文件中图像数据结构的名称,>表示输出重定向,将生成的源代码保存到头文件中去。gdk-pixbuf-csource --raw --name pixbuf_inline about.png > pixbuf.h
生成的pixbuf.h头文件:
/* GdkPixbuf RGBA C-Source image dump */
#ifdef __SUNPRO_C
#pragma align 4 (pixbuf_inline)
#endif
#ifdef __GNUC__
static const guint8 pixbuf_inline[] __attribute__ ((__aligned__ (4))) =
#else
static const guint8 pixbuf_inline[] =
#endif
{ ""
/* Pixbuf magic (0x47646b50) */
"GdkP"
/* length: header (24) + pixel_data (784) */
"\0\0\3("
/* pixdata_type (0x1010002) */
"\1\1\0\2"
/* rowstride (56) */
"\0\0\0""8"
/* width (14) */
"\0\0\0\16"
/* height (14) */
"\0\0\0\16"
/* pixel_data: */
"\\\3029\0^\305;\0`\307=\0b\311@\5^\305;=[\3029\274T\2751\350R\273-\350"
"R\271+\274R\267+=N\264(\5B\251\37\0""6\235\35\0-\224\34\0\\\3029\0^\305"
";\0`\307=\33Y\3026\317t\302Y\377\243\327\226\377\256\334\245\377\256"
"\334\245\377\241\326\225\377j\271P\377B\253\37\317B\251\37\33""6\235"
"\35\0-\224\34\0\\\3029\0^\305;\33U\3004\351\220\316\177\377\267\341\257"
"\377\235\330\222\377\203\316w\377\203\316w\377\235\330\222\377\265\341"
"\256\377\213\310x\3772\235\35\3516\235\35\33-\224\34\0\\\3029\5U\276"
"4\316\220\316\177\377\265\341\256\377z\314m\377v\312j\377r\310h\377t"
"\310h\377u\310h\377y\311k\377\264\337\254\377\211\304v\377-\226\34\316"
"-\224\34\5Y\2764>p\277W\377\267\341\257\377z\314m\377r\310h\377p\307"
"e\377n\305c\377n\304b\377q\304c\377\276\343\266\377~\307o\377\265\337"
"\254\377^\251H\377&\217\34>T\273-\274\241\327\225\377\233\327\221\377"
"v\311i\377o\306d\377n\304a\377o\303a\377o\302a\377\300\344\271\377\377"
"\377\377\377\346\364\343\377\231\321\213\377\235\316\213\377\40\210\34"
"\274K\264&\355\261\335\247\377\200\314r\377s\307f\377\267\341\260\377"
"\326\356\322\377p\301c\377\277\343\270\377\377\377\377\377\374\375\373"
"\377\231\320\214\377~\301i\377\256\327\241\377\36\177\33\355B\255\37"
"\355\257\334\246\377\177\312p\377\200\312s\377\361\371\360\377\377\377"
"\377\377\355\367\353\377\377\377\377\377\374\375\373\377\226\315\210"
"\377q\271[\377}\276g\377\257\327\240\377\36z\33\355B\251\37\274\237\322"
"\221\377\232\324\215\377t\303d\377\207\311y\377\364\372\362\377\377\377"
"\377\377\375\376\375\377\226\313\206\377m\267W\377r\271[\377\227\314"
"\205\377\232\307\207\377\37x\33\274=\244\36>d\260L\377\264\335\252\377"
"y\301d\377q\276_\377\205\305u\377\331\354\324\377\231\315\212\377l\266"
"V\377n\265X\377t\267\\\377\264\332\246\377N\233A\377\37w\33>6\233\35"
"\5/\226\34\316\207\302r\377\262\333\250\377w\274`\377s\272\\\377p\270"
"Y\377o\265Y\377o\265X\377t\267[\377\263\331\245\377\177\270i\377\36q"
"\32\316\37q\33\5""6\233\35\0+\221\34\33\40\212\33\351\203\276m\377\265"
"\333\250\377\230\314\207\377}\274f\377|\272d\377\230\313\206\377\264"
"\331\245\377}\267f\377\35l\32\351\37q\33\33\37q\33\0""6\233\35\0+\221"
"\34\0!\212\34\33\37\203\33\317R\240B\377\232\312\207\377\253\323\233"
"\377\253\322\233\377\226\307\203\377L\227=\377\36n\32\317\37p\33\33\37"
"q\33\0\37q\33\0""6\233\35\0+\221\34\0!\212\34\0\37\201\34\5\37~\33=\37"
"z\33\274\36s\32\350\36p\32\350\37q\33\274\37q\33=\37l\33\5\37p\33\0\37"
"q\33\0\37q\33\0"};
其中length: header (24) + pixel_data (784)是图像的数据长度784和文件头的长度24,文件中图像数据结构的名称是pixbuf_inline。
(2)使用
创建图像对象:pix = gdk_pixbuf_new_from_inline(784+24, pixbuf_inline, TRUE, NULL);
创建图像控件:image = gtk_image_new_from_pixbuf(pix);
2、信息显示程序
(1)代码:tips.c//gdk-pixbuf-csource --raw --name pixbuf_inline about.png > pixbuf.h
#include <gtk/gtk.h>
#include "pixbuf.h"
static gchar *info[5] = {
"Gtk+2.0多条提示信息显示的实现,并有将图片转换成头文件使用。",
"第一条有用的信息:gdk-pixbuf-csource的使用",
"第二条有用的信息:带图像的按钮",
"第三条有用的信息:信息的切换",
"第四条有用的信息:最后一条"
};
static GtkWidget *window;
static GtkWidget *frame;
static GtkWidget *pre_button;
static GtkWidget *next_button;
static GtkWidget *label;
static GtkWidget *title;
gint current_info = 0;
GtkWidget *create_title(GtkWidget *data)
{
GtkWidget *hbox;
GtkWidget *image;
GtkWidget *label;
GdkPixbuf *pix;
pix = gdk_pixbuf_new_from_inline(784+24, pixbuf_inline, TRUE, NULL);
image = gtk_image_new_from_pixbuf(pix);
//pixmap = gdk_pixmap_create_from_xpm_d(data->window, &mask, >K_WIDGET(data)->style->white, (gchar **)pixbuf_inline);
//image = gtk_image_new_from_pixmap(pixmap, NULL);
label = gtk_label_new("提示信息");
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 2);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 2);
return hbox;
}
GtkWidget *create_button(gchar *stockid, gchar *title)
{
GtkWidget *button;
GtkWidget *image;
GtkWidget *label;
GtkWidget *hbox;
image = gtk_image_new_from_stock(stockid, GTK_ICON_SIZE_MENU);
label = gtk_label_new(title);
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 3);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 3);
button = gtk_button_new();
gtk_container_add(GTK_CONTAINER(button), hbox);
return button;
}
void pre_info(GtkButton *button, gpointer data)
{
gint i = current_info - 1;
if (i == -1) return;
if (i == 0) gtk_widget_set_sensitive(pre_button, FALSE);
current_info = i;
gtk_widget_set_sensitive(next_button, TRUE);
gtk_label_set_text(GTK_LABEL(label), info[current_info]);
}
void next_info(GtkButton *button, gpointer data)
{
gint i = current_info + 1;
if (i == 5) return;
if (i == 4) gtk_widget_set_sensitive(next_button, FALSE);
current_info = i;
gtk_widget_set_sensitive(pre_button, TRUE);
gtk_label_set_text(GTK_LABEL(label), info[current_info]);
}
int main (int argc, char *argv[])
{
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *bbox;
GtkWidget *button;
GtkWidget *image;
GtkWidget *title;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"多条信息提示");
gtk_container_set_border_width(GTK_CONTAINER(window),10);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
//gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
gtk_widget_realize(window);
g_signal_connect(G_OBJECT(window),"delete_event",G_CALLBACK(gtk_main_quit),NULL);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 5);
image = gtk_image_new_from_file("about.png");
gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 5);
frame = gtk_frame_new(NULL);
title = create_title(window);
gtk_frame_set_label_widget(GTK_FRAME(frame), title);
gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 5);
label = gtk_label_new(NULL);
gtk_label_set_text(GTK_LABEL(label), info[0]);
gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
gtk_container_add(GTK_CONTAINER(frame), label);
bbox = gtk_hbutton_box_new();
gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
gtk_box_set_spacing(GTK_BOX(bbox), 5);
gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 5);
button = gtk_check_button_new_with_label("每次启动时显示");
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5);
pre_button = create_button(GTK_STOCK_GO_BACK, "上一提示");
gtk_widget_set_sensitive(pre_button, FALSE);
g_signal_connect(G_OBJECT(pre_button), "clicked", G_CALLBACK(pre_info), NULL);
gtk_box_pack_start(GTK_BOX(bbox), pre_button, FALSE, FALSE, 5);
next_button = create_button(GTK_STOCK_GO_FORWARD, "下一提示");
g_signal_connect(G_OBJECT(next_button), "clicked", G_CALLBACK(next_info), NULL);
gtk_box_pack_start(GTK_BOX(bbox), next_button, FALSE, FALSE, 5);
button = gtk_button_new_from_stock(GTK_STOCK_OK);
g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gtk_main_quit), NULL);
gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 5);
gtk_widget_show_all(window);
gtk_main();
return TRUE;
}
(2)编译及运行
gcc -o tips tips.c `pkg-config --libs --cflags gtk+-2.0`
pixbuf.h头文件在当前目录下,若不在当前目录下可通过选项-I指定新的目录。
三、总结
(1)上述的check_button的功能未实现,可以自行添加喜欢的代码。(2)代码已上传到CSDN:http://download.csdn.net/detail/taiyang1987912/9111469。
(3)若有建议,请留言,在此先感谢!