Comment changer les couleurs d'un widget arbitraire dans GTK +?
-
01-07-2019 - |
Question
Si j'écris une application qui souhaite communiquer des informations à l'aide de la couleur, comment puis-je modifier les couleurs d'arrière-plan et de premier plan d'un widget donné? J'aimerais savoir comment faire cela dans Glade si cela est possible, ainsi que par programme (à une couleur calculée).
Je souhaite également savoir comment utiliser un widget complexe, par exemple un HBox
contenant un VBox
contenant des libellés
.
Idéalement, cela inclurait également une solution qui me permettrait de colorer les couleurs existantes du widget et d'identifier les couleurs moyennes de toutes les images utilisées par le thème, afin de pouvoir compenser par programmation les modifications. choix de couleurs pouvant rendre le texte illisible ou se heurter de quelque manière que ce soit - mais je serais heureux si je pouvais simplement tourner un bouton en rouge.
La solution
Exemple de programme:
#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;
}
Autres conseils
La meilleure documentation que je connaisse est celle disponible ici: http://ometer.com/ gtk-colors.html
Vous pouvez toujours utiliser gtk_widget_override_color () et gtk_widget_override_background_color () . Ces deux fonctions vous permettent de changer la couleur d'un widget. Mais il est préférable d'utiliser les classes et les régions CSS dans votre implémentation widget / conteneur via gtk_style_context_add_class ()
et gtk_style_context_add_region ()
. .
Pour modifier la couleur d'un widget, vous pouvez initialiser une couleur et l'utiliser pour modifier la couleur du widget:
GdkColor color;
gdk_color_parse("#00FF7F", &color);
gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
Pour utiliser une image au lieu d'une couleur:
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));