¿Cómo cambio los colores de un widget arbitrario en GTK+?
-
01-07-2019 - |
Pregunta
Si estoy escribiendo una aplicación que desea comunicar cierta información mediante el uso de color, ¿cómo puedo cambiar los colores de fondo y primer plano de un widget determinado?Me gustaría saber cómo hacer esto en Glade, si es posible, así como mediante programación (a un color calculado).
También quiero saber cómo hacer esto con un widget complejo, por ejemplo, un HBox
que contiene un VBox
que contiene algunos Labels
.
Idealmente, esto también incluiría una solución que me permita tinte los colores existentes del widget e identificar los colores promedio de cualquier imagen utilizada por el tema, de modo que pueda compensar mediante programación cualquier elección de color que pueda hacer que el texto sea ilegible o que entre en conflicto, pero sería feliz si pudiera girar un botón. rojo.
Solución
Programa de ejemplo:
#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;
}
Otros consejos
La mejor documentación que conozco es la que está disponible aquí: http://ometer.com/gtk-colors.html
Siempre puedes usar gtk_widget_override_color () y gtk_widget_override_background_color ().Estas dos funciones te permiten cambiar el color de un widget.Pero es mejor usar clases y regiones CSS en la implementación de su widget/contenedor a través de gtk_style_context_add_class()
y gtk_style_context_add_region()
.
Para modificar el color de un widget, puede inicializar un color y usarlo para modificar el color del widget:
GdkColor color;
gdk_color_parse("#00FF7F", &color);
gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &color);
Para usar una imagen en lugar de 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));