Changer la couleur de GtkButton lorsque GtkWindow est changé

J’essaie un exemple de programme Gtk simple et j’utilise GtkTable pour aligner mes widgets.

Ma mise en page devrait être:

Le fond de la fenêtre est noir. Les boutons doivent être blancs tandis que le texte sur les boutons doit être noir. Toutes les étiquettes doivent être blanches pour pouvoir être vues sur le fond noir de la fenêtre.

Avec ça en tête. Voici ce que j’ai fait jusqu’à présent.

Code:

#include  #include  #include  /* for atoi() and exit() */ #include  /* standard in and output*/ typedef struct cmd_widgets{ GtkWidget *button1; GtkWidget *combo; GtkWidget *label; }my_cmd_widgets; static gboolean close_application( GtkWidget *widget, GdkEvent *event, gpointer data ) { gtk_main_quit (); return FALSE; } static void UpdateChoice( GtkWidget *widget, gpointer data) { my_cmd_widgets *widgrp; widgrp = (my_cmd_widgets *)data; gchar *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widgrp->combo)); GSsortingng *val = g_ssortingng_new("You have chosen : "); g_ssortingng_append(val, text); gtk_label_set_text(GTK_LABEL(widgrp->label), val->str); g_free(text); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *table; GtkWidget *label1; GtkWidget *label2; GtkStyle *style; GtkWidget *align; my_cmd_widgets grp_widgets; GtkWidget *image; gtk_init(&argc, &argv); gtk_rc_parse("fonts.rc"); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_title(GTK_WINDOW(window), "Tour App"); gtk_container_set_border_width(GTK_CONTAINER(window), 10); table = gtk_table_new(7, 1, FALSE); gtk_container_add(GTK_CONTAINER(window), table); label1 = gtk_label_new("Our Tour Package Offers"); align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), label1); gtk_table_attach(GTK_TABLE(table), align, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 10); label2 = gtk_label_new("Select City: "); align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), label2); gtk_table_attach(GTK_TABLE(table), align,0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(align); grp_widgets.combo = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Paris"); gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "London"); gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "Tokyo"); gtk_combo_box_append_text(GTK_COMBO_BOX(grp_widgets.combo), "New York"); /* Creates a new button1. */ grp_widgets.button1 = gtk_button_new_with_label ("See Itinerary"); grp_widgets.label = gtk_label_new(""); align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), grp_widgets.label); gtk_table_attach(GTK_TABLE(table), align,0, 1, 5, 6, GTK_FILL, GTK_FILL, 0, 0); gtk_widget_show(align); image = gtk_image_new (); gtk_image_set_from_file (GTK_IMAGE(image), "Images/olympics_logo.gif"); //column 1 gtk_table_attach(GTK_TABLE(table), image, 0, 1, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE(table), grp_widgets.combo, 0, 1, 3, 4, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 0, 15); gtk_table_attach(GTK_TABLE(table), grp_widgets.button1, 0, 1, 4, 5, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_SHRINK, 5, 15); g_signal_connect(window, "destroy",G_CALLBACK(gtk_main_quit), NULL); g_signal_connect (window,"delete-event",G_CALLBACK (close_application), NULL); g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window)); g_signal_connect (G_OBJECT(grp_widgets.button1), "clicked", G_CALLBACK (UpdateChoice), (gpointer)&grp_widgets); gtk_widget_show(table); gtk_widget_show_all(window); gtk_main(); return 0; } 

Voici le fichier rc avec les propriétés de TABLE ET WINDOW:

 style "window" { font_name = "fixed 12" bg[NORMAL] = { 0.0, 0.0, 0.0 } } style "table" { bg[NORMAL] = { 1.0, 1.0, 1.0 } fg[NORMAL] = { 1.0, 1.0, 1.0 } } style "container" { font_name = "bold 12" xthickness = 10 ythickness = 10 bg[NORMAL] = { 1.0, 1.0, 1.0 } fg[NORMAL] = { 1.0, 1.0,1.0 } } style "button" { font_name = "bold 12" xthickness = 10 ythickness = 10 #bg[NORMAL] = { 0.0, 0.0, 0.0 } fg[NORMAL] = { 0.0, 0.0, 0.0 } } #widget_class "*GtkButton*" style "button" widget_class "GtkWindow" style "window" widget_class "*GtkTable*" style "table" 

Le problème dans le code ci-dessus est que le texte du bouton (étiquette) rest blanc lorsque je change le fg en blanc dans les styles de tableau ou de fenêtre. Même après avoir changé le fg en noir (comme ci-dessous), le texte de l’étiquette de mon bouton rest blanc. Aussi, comment puis-je étirer l’image et tous les widgets de la fenêtre de sorte que, chaque fois que je redimensionne ma fenêtre, tous les widgets soient redimensionnés pour s’ajuster à l’écran?

Toutes les étiquettes doivent être blanches pour pouvoir être vues sur le fond noir de la fenêtre.

D’après ce que j’ai trouvé en ligne:

Le widget GtkLabel est l’un des rares widgets GTK + qui ne créent pas leur propre fenêtre dans laquelle se rendre. Pour pouvoir définir la couleur bg d’un widget GtkLabel, vous devez modifier la couleur bg de son parent.

Donc dans ce cas, pour un exemple simple, je n’ai emballé qu’une des étiquettes dans un GtkEventBox.
Pièce de code:

 GtkWidget *eventBox; ... eventBox = gtk_event_box_new(); label1 = gtk_label_new("Our Tour Package Offers"); gtk_container_add(GTK_CONTAINER(eventBox), label1); align = gtk_alignment_new(0.0, 0.5, 0.0, 0.0); gtk_container_add(GTK_CONTAINER(align), eventBox); ... 

fichier rc simplifié:

 style "window" { font_name = "fixed 12" bg[NORMAL] = { 0.0, 0.0, 0.0 } } style "label"{ bg[NORMAL] = { 1.0, 1.0, 1.0 } } widget_class "GtkWindow" style "window" widget_class "*GtkAlignment*GtkEventBox*" style "label" 

et résultat:
entrez la description de l'image ici