Come posso cambiare i colori di un widget arbitrario in GTK+?
-
01-07-2019 - |
Domanda
Se sto scrivendo un'applicazione che vuole comunicare alcune informazioni attraverso l'uso del colore, come posso cambiare i colori di sfondo e primo piano di un dato widget?Mi piacerebbe sapere come farlo in Glade se è possibile, oltre che a livello di codice (su un colore calcolato).
Voglio sapere come eseguire questa operazione anche su un widget complesso, ad esempio an HBox
che contiene a VBox
che ne contiene alcuni Labels
.
Idealmente questo dovrebbe includere anche una soluzione che mi consenta di farlo tinta i colori esistenti del widget e identificare i colori medi di tutte le immagini utilizzate dal tema, in modo da poter compensare a livello di codice qualsiasi scelta di colore che potrebbe rendere il testo illeggibile o altrimenti in conflitto, ma sarei felice se potessi semplicemente girare un pulsante rosso.
Soluzione
Programma di esempio:
#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;
}
Altri suggerimenti
La migliore documentazione che io conosca è quella disponibile qui: http://ometer.com/gtk-colors.html
Puoi sempre usare gtk_widget_override_color () E gtk_widget_override_ background_color ().Queste due funzioni ti permettono di cambiare il colore di un widget.Ma è meglio utilizzare classi e regioni CSS nell'implementazione del widget/contenitore through gtk_style_context_add_class()
E gtk_style_context_add_region()
.
Per modificare il colore di un widget puoi inizializzare un colore e usarlo per modificare il colore del widget:
GdkColor color;
gdk_color_parse("#00FF7F", &color);
gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
Per utilizzare un'immagine invece del colore:
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));