2008-09-19 65 views
4

如果我正在编写一个想通过颜色使用某些信息的应用程序,我该如何更改给定小部件的背景和前景颜色?我想知道如何在glade中做到这一点,如果可能的话,以及以编程方式(计算颜色)。如何更改GTK +中任意小部件的颜色?

我想知道如何对一个复杂的小部件执行此操作,例如,HBox包含一个VBox,其中包含一些Labels

理想的情况下,这也将包括解决方案的解决方案,可以让我色调窗口小部件的现有颜色,并通过主题识别正在使用的任何图像的平均色彩,让我可以以编程方式补偿任何颜色的选择可能使文本不可读或以其他方式冲突 - 但如果我只需将一个按钮变成红色,我会很高兴。

回答

8

示例程序:

#include <gtk/gtk.h> 

static void on_destroy(GtkWidget* widget, gpointer data) 
{ 
     gtk_main_quit(); 
} 

int main (int argc, char* argv[]) 
{ 
     GtkWidget* window; 
     GtkWidget* button; 

     gtk_init(&argc, &argv); 
     window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     g_signal_connect(G_OBJECT (window), "destroy", 
       G_CALLBACK (on_destroy), NULL); 
     button = gtk_button_new_with_label("Hello world!"); 
     GdkColor red = {0, 0xffff, 0x0000, 0x0000}; 
     GdkColor green = {0, 0x0000, 0xffff, 0x0000}; 
     GdkColor blue = {0, 0x0000, 0x0000, 0xffff}; 
     gtk_widget_modify_bg(button, GTK_STATE_NORMAL, &red); 
     gtk_widget_modify_bg(button, GTK_STATE_PRELIGHT, &green); 
     gtk_widget_modify_bg(button, GTK_STATE_ACTIVE, &blue); 
     gtk_container_add(GTK_CONTAINER(window), button); 
     gtk_widget_show_all(window); 
     gtk_main(); 
     return 0; 
} 
1

要修改小部件的颜色,您可以初始化一个颜色,并用它来修改小部件的颜色:

GdkColor color; 
gdk_color_parse("#00FF7F", &color); 
gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color); 

要使用图片代替颜色:

GdkPixbuf *image = NULL; 
GdkPixmap *background = NULL; 
GtkStyle *style = NULL; 

image = gdk_pixbuf_new_from_file ("background.jpg", NULL); 
gdk_pixbuf_render_pixmap_and_mask (image, &background, NULL, 0); 
style = gtk_style_new(); 
style->bg_pixmap [0] = background; 

gtk_widget_set_style (GTK_WIDGET(widget), GTK_STYLE (style));