如何在GTK + 2.0中使用图像作为gtk工具栏的背景

时间:2014-01-03 03:41:16

标签: image background gtk toolbar gtk2

是否有类似gtk_widget_modify_bg()的api来修改图像的gtk工具栏的背景。

gtk_widget_modify_bg()只能改变背景的颜色。

1 个答案:

答案 0 :(得分:0)

经过一天的尝试,现在我已经知道如何为gtk工具栏设置图像背景。

关键点是你无法直接修改GtkToolbar甚至GtkVBox的背景(通常你会把GtkToolbar放在GtkVBox中)。因为他们都没有窗口GtkWidget,所以他们无法捕捉曝光事件,于是无法绘制自己的背景。他们的背景与他们的父母相同。

但是GtkEventBox可以。因此,您可以将GtkToolbar放入GtkEventBox,并将GtkEventBox放入GtkVBox。然后你用图像修改GtkEventBox的背景,似乎GtkToolBar的背景发生了变化。

以下是我的测试代码:

int main(int argc, char* argv[])
{
    GtkWidget* window;
    GtkWidget* vbox;
    GtkWidget* event_box;
    GtkWidget* toolbar;
    GtkToolItem* item;

    gtk_init(&argc, &argv);
    gtk_rc_parse("./gtk.rc");

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window), 250, 200);
    gtk_window_set_title(GTK_WINDOW(window), "toolbar");

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    event_box = gtk_event_box_new();
    //gtk_widget_set_name(vbox, "toolbar_event_box");
    //set_event_box_background(event_box);
    gtk_box_pack_start(GTK_BOX(vbox), event_box, FALSE, FALSE, 5);

    toolbar = gtk_toolbar_new();
    gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
    gtk_container_set_border_width(GTK_CONTAINER(toolbar), 2);

    item = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

    item = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

    item = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

    item = gtk_separator_tool_item_new();
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

    item = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
    g_signal_connect(G_OBJECT(item), "clicked", G_CALLBACK(gtk_main_quit), NULL);
    gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item, -1);

    gtk_container_add(GTK_CONTAINER(event_box), toolbar);

    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

我使用gtkrc文件来设置GtkEventBox背景。以下是gtk.rc:

pixmap_path "/usr/share/pixmaps:/usr/share/myself"

style "window"
{
  bg_pixmap[NORMAL] = "firefox.png"
}

style "toolbar"
{
  bg_pixmap[NORMAL] = "bk.bmp"
}

widget_class "GtkWindow" style "window"
widget_class "GtkEventBox" style "toolbar"

程序运行的结果:

result of the program

如果您不使用gtkrc文件,则可以使用gtk_widget_set_style()更改GtkEventBox背景。像这样:

void set_event_box_background(GtkWidget* event_box)
{
    GError* error = NULL;
    GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file("/usr/share/myself/bk.bmp", &error);
    GdkPixmap *pixmap = NULL;
    GdkPixmap *mask = NULL;

    gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &mask, 255);
    GtkStyle* orig_style = gtk_widget_get_style(event_box);
    GtkStyle* style = gtk_style_copy(orig_style);
    style->bg_pixmap[GTK_STATE_NORMAL] = pixmap;
    gtk_widget_set_style(event_box, style);
}

我从Yuren's Info Area获得此方法 使用此方法时,您应在gtk_rc_parse("./gtk.rc");函数上方评论set_event_box_background(event_box);并取消注释main()行。