GTK+浅谈之七多条提示信息的显示

一、简介

        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)若有建议,请留言,在此先感谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值