IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

GTK2 checkbutton : paramétrer la couleur de fond du check en fonction de son état


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut GTK2 checkbutton : paramétrer la couleur de fond du check en fonction de son état
    Bonjour,

    je suis contrant à GTK2.x.
    je ne trouve pas la primitive permettant de paramétrer la couleur de la case du check en fonction de l'état du bouton. Par défaut le check devient rouge, je voudrais qu'il soit vert indiquant la disponibilité de la ressource.

    Nom : GTK2checkbox.png
Affichages : 170
Taille : 10,8 Ko

    J'ai essayé la primitive gtk_widget_modify_base() mais cela ne fait rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GdkColor colGreen;
    gdk_color_parse("#90ee90", &colGreen);
    GtkWidget * myCheck = gtk_check_button_new_with_label("S1");
    gtk_widget_modify_base(GTK_WIDGET(myCheck), GTK_STATE_ACTIVE, &colGreen);
    Il semble qu'en utilisant un fichier CSS cela pourrait fonctionner, mais il semble que cette notion n'est pas dispo en GTK2.
    Merci pour vos conseils.

    Sylvain

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Sylvain Rousseau Voir le message
    Bonjour,
    Bonjour.


    Citation Envoyé par Sylvain Rousseau Voir le message
    je suis contrant à GTK2.x.
    Je compatis

    Citation Envoyé par Sylvain Rousseau Voir le message
    je ne trouve pas la primitive permettant de paramétrer la couleur de la case du check en fonction de l'état du bouton. Par défaut le check devient rouge, je voudrais qu'il soit vert indiquant la disponibilité de la ressource.
    Tout d'abord il faut bien savoir que c'est ton environnement graphique qui décide de l'apparence de ton application. Donc chez toi c'est rouge et peut-être que chez moi se sera bleu. Normalement le style de l'environnement graphique est prioritaire. Ceci dit on peut bien entendu passer outre. Pour Gtk2 il faut passer par les GtkRcStyle.

    Comme les GtkCheckButton héritent des GtkWidget il y a quelques fonctions qui te permettent de modifier directement l'aspect graphique. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void
    gtk_widget_modify_fg (GtkWidget *widget,
                          GtkStateType state,
                          const GdkColor *color);
    Pour accéder au GtkRcStyle du widget concerné tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GtkRcStyle *
    gtk_widget_get_modifier_style (GtkWidget *widget);
    Et pour affecter un style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void
    gtk_widget_modify_style (GtkWidget *widget,
                             GtkRcStyle *style);
    Pour finir voila la structure d'un GtkRcStyle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct {
      gchar *name;
      gchar *bg_pixmap_name[5];
      PangoFontDescription *font_desc;
     
      GtkRcFlags color_flags[5];
      GdkColor   fg[5];
      GdkColor   bg[5];
      GdkColor   text[5];
      GdkColor   base[5];
     
      gint xthickness;
      gint ythickness;
    } GtkRcStyle;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Salut Gerald !
    merci pour cette réponse très pédagogique.
    Grâce à toi, je m'approche de la solution, mais pour l'instant cela ne fonctionne toujours pas.
    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GdkColor colGreen;
    gdk_color_parse("#90ee90", &colGreen);
    GtkWidget * myCheck = gtk_check_button_new_with_label("S1");
    GtkRcStyle *pCheckboxStyle = gtk_widget_get_modifier_style(myCheck );
    pCheckboxStyle->fg[0] = colGreen;
    pCheckboxStyle->bg[0] = colGreen;
    gtk_widget_modify_style(myCheck , pCheckboxStyle);
    Je remarque que les champs GtkRcStyle.fg/bg sont des tableaux de taille 5 , bizarre ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    struct _GtkRcStyle
    {
      GObject parent_instance;
     
      /*< public >*/
      gchar *name;
      gchar *bg_pixmap_name[5];
      PangoFontDescription *font_desc;
      GtkRcFlags color_flags[5];
      GdkColor   fg[5];
      GdkColor   bg[5];
      GdkColor   text[5];
      GdkColor   base[5];
      gint xthickness;
      gint ythickness;
      /*< private >*/
      GArray *rc_properties;
      /* list of RC style lists including this RC style */
      GSList *rc_style_lists;
      GSList *icon_factories;
     guint engine_specified : 1;	/* The RC file specified the engine */
    };
    Du coup, j'ai tenté de remplir tout le tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int iSt = 0; iSt < 5; iSt++)
    {
    pCheckboxStyle->fg[iSt] = colGreen;
    pCheckboxStyle->bg[iSt] = colGreen;
    }
    Mais ça donne rien non plus.

    Le nombre 5, ça ressemble beaucoup à la taille de cet enum ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Widget states */
    typedef enum
    {
      GTK_STATE_NORMAL,
      GTK_STATE_ACTIVE,
      GTK_STATE_PRELIGHT,
      GTK_STATE_SELECTED,
      GTK_STATE_INSENSITIVE
    } GtkStateType;
    En visitant gtkwidget.h je vois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GtkRcStyle *gtk_widget_get_modifier_style (GtkWidget            *widget);
    void        gtk_widget_modify_fg          (GtkWidget            *widget,
    					   GtkStateType          state,
    					   const GdkColor       *color);
    void        gtk_widget_modify_bg          (GtkWidget            *widget,
    					   GtkStateType          state,
    					   const GdkColor       *color);
    Du coup, il semble que l'api gtk_widget_modify_fg/bg adresse le bon élément du tableau GtkRcStyle.fg/bg[].
    Malheureusement l'appel de ces fonctions n'ont aucun effet :-(


    Sylvain

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bon je t'avoue que ma première réponse, je l'ai faite dans le virtuel sans rien tester du tout. Comme ça fait un bon moment que je ne travaille plus avec Gtk2 je pensais, à tord, te donner une réponse simple et efficace.

    Je me suis retroussé les manches et me suis aperçu que Gtk2 a continué d'évoluer. Tout ce qui est lié aux styles est pour ainsi dire devenu obsolète. Ils ont intégré Cairo en lieu et place. La seule manière "simple" qu'il nous reste sans être obligé d'ouvrir le moteur est de passer par les Gtkrc files. Malgré cette technique je ne suis pas arrivé à modifier l'aspect du GtkRadioButton inclus dans le GtkCheckbutton. J'arrive cependant à accéder à la couleur du texte et la couleur du fond du bouton.

    Je te livre ici mes recherches et un code exemple minimaliste.

    Le principe de départ est d'avoir un fichier texte au format Gtkrc. Pour avoir les explication de ce format voila le lien du tutoriel officiel.

    Gtk inclut par défaut certains fichiers Gtkrc lors du démarrage de l'application. Si on veut ajouter notre propre fichier il faut utiliser la fonction gtk_rc_add_default_file ();. Cette fonction DOIT ÊTRE exécutée avant le gtk_init ();. Pour parfaire tout ce petit monde tu peux utiliser la fonction gtk_rc_get_default_files (); pour voir quels fichiers Gtkrc sont chargés. Tu t'assures ainsi que ton fichier fait parti de la liste. En résumé le code commence ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <gtk/gtk.h>
     
    gint
    main (gint argc, gchar **argv)
    {
      /* ajout du gtkrc personnel.
       * Site d'exeplication du gtkrc : 
       * https://wiki.gnome.org/Attic/GnomeArt/Tutorials/GtkThemes */
      gtk_rc_add_default_file ("./test.gtkrc");
     
      /* Affichage pour information des fichiers gtkrc pris en charge */
      gchar **rcfiles = gtk_rc_get_default_files ();
      for (gint i=0; rcfiles[i]; i++)
        g_print ("%s\n", rcfiles[i]);
      g_print ("\n");
     
      /* Initialisation de Gtk */
      gtk_init (&argc, &argv);
    Au lancement voila liste des fichiers chargés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /usr/share/gtk-2.0/gtkrc
    /etc/xdg/xdg-gnome/gtk-2.0/gtkrc
    /etc/xdg/xdg-gnome/gtk-2.0/gtkrc
    /etc/gtk-2.0/gtkrc
    /home/gerald/.gtkrc-2.0
    ./test.gtkrc
    Le dernier fichier correspond bien au mien.

    Maintenant le contenu de test.gtkrc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    style "label-style"
    {
      # and the forground
      fg[NORMAL] = "#aa0000"
      fg[PRELIGHT] = "#ff0000"
      fg[ACTIVE] = "#0000ff"
      fg[SELECTED] = "#0000ff"
    }
     
    style "button-style"
    {
      # modify the x/ythickness, used for spacing all over the place
      xthickness = 3
      ythickness = 3
     
      # one can set so called "style properties"
      GtkRange::slider-width = 15
     
      # set the background
      bg[NORMAL] = "#00aa00"
      bg[ACTIVE]  = "#00aa00"
      bg[PRELIGHT] = "#00aa00"
      bg[SELECTED] = "#0000ff"
    }
     
    #Application du style "label-style" au texte du GtkCheckButton
    widget "*.my-button.GtkLabel" style : highest "label-style"
     
    # Application du style "button-style" au GtkCheckbutton dans son ensemble
    widget "*.my-button" style : highest "button-style"
    Ce code crée deux styles :
    • label-style : change la couleur du texte
    • button-style : change la couleur de fond lorsque la souris passe dessus


    Comme tu peux le constaté pour appliquer un style particulier j'ai utilisé la commande "widget". Dans cette commande j'ai spécifié le nom "my-button". Ceci permet d'appliquer un style particulier à un widget particulier de ton application. Il faudra donc dans le code source C donner le même nom au widget désigné.

    Le code source complet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <gtk/gtk.h>
     
    gint
    main (gint argc, gchar **argv)
    {
      /* ajout du gtkrc personnel.
       * Site d'explication du gtkrc : 
       * https://wiki.gnome.org/Attic/GnomeArt/Tutorials/GtkThemes */
      gtk_rc_add_default_file ("./test.gtkrc");
     
      /* Affichage pour information des fichiers gtkrc pris en charge */
      gchar **rcfiles = gtk_rc_get_default_files ();
      for (gint i=0; rcfiles[i]; i++)
        g_print ("%s\n", rcfiles[i]);
      g_print ("\n");
     
      /* Initialisation de Gtk */
      gtk_init (&argc, &argv);
     
      /* Création d'une fenêtre principale */
      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_widget_set_size_request (window, 200, 200);
      g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
      /* Insertion dun GtkVbox dans la fenêtre principale */
      GtkWidget *vbox = gtk_vbox_new (TRUE, 5);
      gtk_container_add (GTK_CONTAINER (window), vbox);
     
      /* Insertion d'un GtkCheckButton dans le vbox */
      GtkWidget *checkbutton = gtk_check_button_new_with_label ("test");
      gtk_widget_set_name (checkbutton, "my-button");
     
      gtk_box_pack_start (GTK_BOX (vbox), checkbutton, FALSE, FALSE, 0);
     
      gtk_widget_show_all (window);
     
      gtk_main ();
     
      return 0;
    }
    Capture d'écran du résultat :
    Nom : Capture d’écran_2022-10-23_11-43-45.png
Affichages : 144
Taille : 8,6 Ko

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Bonjour Gérald,

    merci beaucoup pour tes recherches et cette réponse digne d'un tuto pro !

    Je vais donc tester et je te donnerai mes résultats.

    Sur ton screenshot, je vois que tu colores le fond du check button en vert quand il est unchecked et que la couleur de la petite boite qui contient le "check" est gris/blanche.
    Quelle est couleur de la petite boite qui contient le "check" quand le check button est checked ?
    C'est précisément cette petite surface qui prend la couleur rouge chez moi quand le check button est checked et que je voudrais passer en vert.
    Je suppose que cet aspect sera impacté par le champ : bg[SELECTED] = "#0000ff" dans le fichier rc, qu'en penses tu ?

    Amicalement

    Sylvain

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Malheureusement pour toi c’est justement cette box que je ne suis pas arrivé à changer la couleur. J’ai supposé que c’est un GtkRadioButton inclus dans le GtkCheckButton.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 24
    Points
    24
    Par défaut
    Salut Gérald,

    il faudrait peut être lister les widgets "enfants" du widget créé par le gtk_check_button_new_with_label() et trouver lequel est cette case cochable, lui donner un nom et le lier à un fichier rc.
    Qu'en penses tu ?

  8. #8
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Oui ça peut être une bonne piste de travail.

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/11/2020, 17h54
  2. [XL-2002] Couleur de fond de cellule en fonction des valeurs
    Par zoumzoum59 dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 20/01/2018, 08h29
  3. TDBGRID - Couleur de fond d'une seule cellule
    Par cgo dans le forum Bases de données
    Réponses: 5
    Dernier message: 11/09/2009, 10h16
  4. Réponses: 2
    Dernier message: 20/12/2007, 15h43
  5. Réponses: 4
    Dernier message: 31/07/2006, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo