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 :

Modification de la couleur foreground


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut Modification de la couleur foreground
    Bonjour,

    Dans une fenêtre GTK_WINDOW_TOPLEVEL, je mets un VBox. Dans le VBox, je mets un Button avec un label et un DrawingArea.
    Le DrawingArea n'est pas visbile. Il est affiché ou masqué lorsque l'on clique sur le bouton (s'il est masqué, le clique sur le bouton l'affiche et vice-versa).

    Dans le drawing area, je dessine un rectangle couvrant tout le widget, en modifiant la couleur de foreground du widget.

    J'ai un problème, car lorsque j'ai affiché le drawingarea, puis lorsque je le masque, la couleur du label du bouton est modifiée ! Sa couleur devient identique à la couleur que j'utilise pour dessiner le rectangle du drawing area.

    Voici le code de dessin dans le drawing area :

    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
     
    /*static*/ 
    gboolean cAppShowHideWidget::s_boDrawingAreaExposeEvent(GtkWidget* pArea, GdkEventExpose* pEvent)
    {
    	int nWidth = pArea->allocation.width;
    	int nHeight = pArea->allocation.height;
     
    	GdkGC* pGC = pArea->style->fg_gc[GTK_WIDGET_STATE(pArea)];
     
    	GdkColor Color = {0, 192*0xFFFF/0xFF, 0, 0};	
    	gdk_gc_set_rgb_fg_color(pGC, &Color);
     
    	gdk_draw_rectangle(
    		pArea->window,
    		pGC,
    		TRUE, /*filled*/
    		0, 0,
    		nWidth, nHeight
    	);
     
    	return TRUE;
    }
    Je ne vois pas pourquoi la modification de la couleur de foreground du widget drawing area impact la couleur de foreground du bouton avec label.

    Si quelqu'un a une explication, je suis preneur.

    Merci.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    L'explication est toute simple.

    Pour des raisons de simpliçité ( pour ne pas dire de faignantise ) tu récupères le GdkGC de ton drawingaera qui est en fait le GdkGC de ton programme. Tu affectes ensuite à ce GdkGC une nouvelle couleur d'avant plan. Il est donc normal que tous les widgets de ton programme utilisent cette couleur lorsque leur mise à jour graphique est nécessaire.

    Pour éviter cet ennuyeux problème il faut créer un nouveau GdkGC. Lorsque tu en a fini libère la mémoire avec la fonction g_oject_unref();

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Pour des raisons de simpliçité ( pour ne pas dire de faignantise ) tu récupères le GdkGC de ton drawingaera qui est en fait le GdkGC de ton programme.
    Je ne suis pas sur de bien comprendre.
    Le GdkGC vient du widget qui est passé en pointeur à la callback et le widget en question est bien le drawing area.

    Est-ce que je dois comprendre que tous les widgets qui sont créés et ajoutés dans une fenêtre se partagent les mêmes GdkGC ?

    Merci de bien vouloir m'éclairer sur ce point.

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pour répondre simplement : oui. Tu peux faire sensiblement différement si tu veux conserver ta manière de faire.
    Lorsque tu récupères le GdkGC du drawingarea sauve dans un GdkColor la couleur actuellement active. Ensuite modifie-là pour tes besoins. Lorsque tu en a fini utilises ta sauvegarde pour remettre les choses dans l'ordre.

    Pour récupérer le foreground actuel tu peux utiliser la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void                gdk_gc_get_values                   (GdkGC *gc,
                                                             GdkGCValues *values);
     
    Retrieves the current values from a graphics context. Note that only the pixel values of
    the values->foreground and values->background are filled, use
    gdk_colormap_query_color() to obtain the rgb values if you need them.
     
    gc :
    	a GdkGC.
     
    values :
    	the GdkGCValues structure in which to store the results.
    Sachant que la structure GdkGCValues contient :
    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
    typedef struct {
      GdkColor	    foreground;
      GdkColor	    background;
      GdkFont	   *font;
      GdkFunction	    function;
      GdkFill	    fill;
      GdkPixmap	   *tile;
      GdkPixmap	   *stipple;
      GdkPixmap	   *clip_mask;
      GdkSubwindowMode  subwindow_mode;
      gint		    ts_x_origin;
      gint		    ts_y_origin;
      gint		    clip_x_origin;
      gint		    clip_y_origin;
      gint		    graphics_exposures;
      gint		    line_width;
      GdkLineStyle	    line_style;
      GdkCapStyle	    cap_style;
      GdkJoinStyle	    join_style;
    } GdkGCValues;

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Par défaut
    Ok merci pour toutes ces précisions !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/02/2009, 14h13
  2. Modification de la couleur d'une barre dans un graphique
    Par mat-tech dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/08/2008, 19h19
  3. Réponses: 5
    Dernier message: 18/12/2007, 20h26
  4. [Couleur] Modification du code couleur de l'interface
    Par Therich dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/01/2006, 20h00
  5. Réponses: 12
    Dernier message: 22/02/2005, 22h48

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