Image 如何使用图像作为gtk+中gtk工具栏的背景;2
是否有任何类似gtk_widget_modify_bg()的api可以通过图像修改gtk工具栏的背景Image 如何使用图像作为gtk+中gtk工具栏的背景;2,image,background,gtk,toolbar,gtk2,Image,Background,Gtk,Toolbar,Gtk2,是否有任何类似gtk_widget_modify_bg()的api可以通过图像修改gtk工具栏的背景 gtk_widget_modify_bg()只能更改背景颜色。经过一天的尝试,现在我已经知道如何为gtk工具栏设置图像背景 关键是,您不能直接修改GtkToolbar甚至GtkVBox的背景(通常您会将GtkToolbar放在GtkVBox中)。因为它们都是无窗口的GtkWidget,所以它们无法捕获暴露事件,然后无法绘制自己的背景。他们的背景和父母一样 但是GtkEventBox可以。因此,您
gtk_widget_modify_bg()只能更改背景颜色。经过一天的尝试,现在我已经知道如何为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"
程序运行的结果:
如果不使用gtkrc文件,可以使用gtk\u widget\u set\u 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);
}
我从中获得此方法。使用此方法时,应注释
gtk_rc_parse(“./gtk.rc”)代码>和取消注释设置事件框\u背景(事件框)代码>行在上面的main()
函数中。请注意,这仅适用于GTK 2.x,在GTK 3.x中,您将使用CSS。