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 :

cairo : colorier les wigjet une seule fois


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut cairo : colorier les wigjet une seule fois
    Bonjour

    Voici le code incriminé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void style1(GtkWidget *ChildWidget, cairo_t *cr)
    {
         static unsigned long i=0;
     
         i++;
         printf("%lu\n",i);
     
         style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
         bord(ChildWidget,cr);
     
    }
    Celui se lance lors du "draw" du widget, voici l'extrait du fichier glade :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <signal name="draw" handler="style1" swapped="no"/>
    Dès que je passe la souris sur l'item je vois les valeurs de i qui défilent => j'aimerai ne pas passer plusieurs fois.

    Si je modifie le code comme ceci j'ai une autre surprise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void style1(GtkWidget *ChildWidget, cairo_t *cr)
    {
         static unsigned long i=0;
     
         style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
         bord(ChildWidget,cr);
     
         i++;
         printf("%lu\n",i);
     
    }
    Le wigdet se colorie bien, mais le texte et ses boutons radio ne sont plus visibles (ce widget n'a pas autres éléments) => pourquoi l'ordre importe ?

    Mon but étant de ne faire la couleur une seule fois, je modifie donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void style1(GtkWidget *ChildWidget, cairo_t *cr)
    {
         static unsigned long i=0;
     
         i++;
         printf("%lu\n",i);
     
         if (i==1)
         {
             style (ChildWidget,cr,1.*0xf0/255,1.*0xe6/255,1.*0x8c/255);
             bord(ChildWidget,cr);
         }
    }
    Je ne vois rien de spécial dans l'affaire... Le problème, c'est que chaque fois que la souris passe sur un bouton radio (pas un label) le bouton et son texte passe en gris clair sur gris clair (couleur de fond pas défaut). Je ne vois plus les boutons et leur texte , mais le label reste.

    La raison de ces tests, c'est que je souhaite modifier l'affichage d'un sous-menu. Les couleurs dépendent des choix du moment (des éléments cochés dans d'autres menus) et le calcul de la couleur d'un item est long. Je ne voulais les faire que lorsque que c'était utile. Si je commence ma fonction callback par un test pour éviter le calcul, lorsque je demande de ne pas colorier, ma case devient gris-clair sur gris-clair.
    Je pourrais certes mémoriser la couleur dans un tableau static pour ne pas refaire le calcul, mais si en plus, je pouvais éviter les appels suivants, je pense que je gagnerai du temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cairo_set_source_rgb (cr, rouge, vert, bleu); // Affectation de la couleur récupérée en tant que donnée utilisateur
    cairo_paint(cr);
    nb : un des but du travail que je fais est d’accélérer (sans avoir besoin de changer de PC) mon ancien programme qui marchent bien, mais avec des grosses lenteurs (et qui compile avec des warning : attention, fonction obsolète).
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  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
    Salut Troumad.


    Sans préjuger des résultats de tes tests commence par respecter le prototype de la fonction callback associée au signal draw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean user_function (GtkWidget *widget, CairoContext *cr, gpointer user_data)
    Retourne FALSE; pour laisser ce signal se propager aux autres fonctions internes associées.

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    OK !

    Je comprends plus de choses. Mais le retour de FALSE ne modifie pas tout ce que j'aimerai. L'écriture reste, mais le fond disparait. Il faudrait que le fond soit un style donné à l'item dans ce cas, pas un cairo qui ne s'applique que lorsqu'il est dessiné.
    Et si je comprends bien, certains items sont redessinés dès que la souris bouge dessus pour remettre à jour ce qui était avant sous la souris. L'absence du FALSE achevait le travail qui consistait à faire l'écriture du texte. Mais pas toujours (pas la première fois) et pas pour tous les item (le label reste).
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Je pense qu'il y a deux réponses possibles à ton problème :

    - soit dans ton callback du signal draw, tu as TOUT le code pour dessiner,
    - soit tu crées une copie en mémoire de ton espace d'affichage (à l'aide d'une objet cairo_surface_t) sur laquelle tu vas dessiner et que tu plaqueras à l'affichage à chaque émission du signal draw.

    Voir l'exemple : https://developer.gnome.org/gtk3/stable/ch01s05.html

    Jean-Marie
    Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/05/2012, 16h30
  2. Charger les données une seule fois ou dans chaque session.
    Par archer dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 28/10/2010, 12h18
  3. [MySQL] afficher une seule fois les réponses identiques
    Par Giantrick dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2007, 12h35
  4. Réponses: 10
    Dernier message: 02/05/2007, 10h19
  5. [XSLT] Afficher une seule fois les attributs redondants...
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/11/2005, 09h52

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