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 :

Modifier l'image d'un bouton GtkStockItem


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut [resolu] Modifier l'image d'un bouton GtkStockItem
    a tous


    Sur mon appli j'ai un bouton "connect" pris dans les GtkStockItem ("GTK_STOCK_CONNECT"), j'aimerais que lorsque l'utilisateur clic sur ce bouton, l'image, ainsi que le texte change pour devenir celui du bouton "GTK_STOCK_DISCONNECT".

    J'ai trouvé les fonctions qui permettent de recuperer le nom du bouton: Avec celle ci je pourrais determiner si je dois passer le bouton en "connect" ou "disconnect".

    J'en ai trouvé une autre qui permet de changer le label du bouton:
    Mais pour change un bouton créé a partir d'un stockitem je n'ai rien pu trouver

    Est ce que je suis obligé de créer des boutons "vide" auxquels je rajoute label, raccourci et images manuellement, afin de les changer facilement dans la fonction de réponse a l'evenement "clicked", ou bien y a t il une autre méthode qui m'a échappée


    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut... tout d'abord, bienvenue sur les forums de developpez.com


    Ce que j'aurais fait (dans l'ordre):

    L'image et le label inséré dans le bouton une fois le tout créé. Ensuite, il suffit dans le cas du changement de l'image d'en créer une nouvelle de la même manière que la précédente puis d'utiliser la fonction gtk_button_set_image (GTK+ 2.6 ou +)

    Voilà, c'est un peu plus long à mettre en oeuvre mais le résultat est là
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Merci pour la bienvenue et pour tes conseils

    Donc j'ai ecrit une fonction qui me crée un bouton avec un label, une image du GTK_STOCK_ITEM et une taille GtkIconSize:

    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
     
    GtkWidget* AddButton(GtkWidget *pWindow, const char *str, const gchar *stock_id, GtkIconSize size)
    {
        GtkWidget *pButton;
        GtkWidget *pHBox;
        GtkWidget *pLabel;
        GtkWidget *pImage;
     
        pButton=gtk_button_new();       // bouton vierge
     
        pHBox=gtk_hbox_new(FALSE,1);    // Boite horizontale
        gtk_container_add(GTK_CONTAINER(pButton),pHBox);    // ajoutée au Widget parent "pButton"
     
        pImage=gtk_image_new_from_stock(stock_id,size);     // Image
        gtk_box_pack_start(GTK_BOX(pHBox),pImage,FALSE,FALSE,1);    // ajoutée dans la HBox
     
        pLabel=gtk_label_new(str);      // Label
        gtk_box_pack_start(GTK_BOX(pHBox),pLabel,FALSE,FALSE,1);    // ajouté dans la HBox
     
        return pButton;
    }
    Dans la fenetre principale j'ajoute le bouton de cette maniere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        GtkWidget *pButton;
     
    ....
    ....
        pButton=AddButton(pMainWindow,"Connexion",GTK_STOCK_CONNECT,GTK_ICON_SIZE_BUTTON);
        g_signal_connect(G_OBJECT(pButton),"clicked",G_CALLBACK(OnConnect),pButton);
    Je passe donc a ma fonction callback un pointeur sur ce bouton afin de pouvoir travailler dessus (changement du label, et de l'image).

    Par contre apres je ne sais pas du tout comment faire pour récuperer les données du bouton. J'essaie de faire un simple affichage du label actuel du bouton sur la console sans succes Comment dois je m'y prendre svp?

    Question subsidiaire , lorsqu'on crée un bouton a partir d'un gtk_button_new(), comment faire pour mettre en place la meme fonctionnalité que dans le gtk_button_new_with_mnemonic() afin d'activer le bouton via un raccourci clavier (Alt+"touche"), si cela est possible bien entendu

    Merci d'avance

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Marmoccelle
    Je passe donc a ma fonction callback un pointeur sur ce bouton afin de pouvoir travailler dessus (changement du label, et de l'image).
    Ceci est inutile car dans la signature du callback, le premier argument de type GtkWidget est un pointeur sur le widget ayant pris en charge le signe donc ici ton bouton.

    Citation Envoyé par Marmoccelle
    Par contre apres je ne sais pas du tout comment faire pour récuperer les données du bouton. J'essaie de faire un simple affichage du label actuel du bouton sur la console sans succes Comment dois je m'y prendre svp?
    Ce que je ferais dans un premier temps, c'est de créer une petite structure contenant l'état du bouton (il faut bien en garder une trace quelque part) et un pointeur sur le bouton. Cette strcuture serait en fait la donnée que tu passes à l'enregistrement du callback. Puis voici le tout avec une ébauche possible de ton callback:
    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
    typedef struct
    {
       int state;
       GtkWidget * p_wid;
    }
    ConnectButton;
     
     
    void cb_button_connection_clicked (GtkWidget * p_wid, gpointer p_data)
    {
       ConnectButton * p_btn = p_data;
     
       switch (p_btn->state)
       {
          /* Etat connecte. */
          case 0:
          {
             /*
              * Ici chargement d'un GtkImage avec un GTK_STOCK_CONNECT et
              * ajout de l'image sur le bouton voir meme changement du
              * titre du bouton.
              */
          }
          break;
     
          /* Etat deconnecte. */
          case 1:
          {
             /*
              * Ici chargement d'un GtkImage avec un GTK_STOCK_DISCONNECT et
              * ajout de l'image sur le bouton voir meme changement du
              * titre du bouton.
              */
          }
          break;
       }
    }
    Citation Envoyé par Marmoccelle
    Question subsidiaire , lorsqu'on crée un bouton a partir d'un gtk_button_new(), comment faire pour mettre en place la meme fonctionnalité que dans le gtk_button_new_with_mnemonic() afin d'activer le bouton via un raccourci clavier (Alt+"touche"), si cela est possible bien entendu
    Il faudra sans doute voir du côté des GtkAccelGroup
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Une nouvelle fois merci pour ton aide

    Je n'avais pas du tout pensé a une telle méthode. En fait j'avais dans l'idée ce type de fonctionnement:

    Dans la fonction callback, je récupere le label du bouton ("connexion" ou "deconnexion").
    Ensuite:
    => Si label=="connexion": Changer le label pour "deconnexion" et changer l'image en GTK_STOCK_DISCONNECT.
    => Sinon Changer le label en "connexion" et changer l'image en GTK_STOCK_CONNECT


    Sinon j'ai trouvé une méthode pour récuperer le label, en utilisant les listes chainées, dis moi ce que tu en penses stp (en tout cas j'arrive bien a récuperer/afficher le label du bouton)

    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
     
    void OnConnect(GtkWidget *pWidget, gpointer pData)
    {
        gchar *sButtonName;
     
     
        gpointer pBox,pItemFromBox;
        GList *liste = NULL;
        GList *liste2=NULL;
     
     
        liste = gtk_container_get_children(GTK_CONTAINER(GTK_BUTTON(pWidget)));
        pBox = g_list_nth_data(liste, 0);       // Le bouton contient 1 seul Widget => la hbox
     
        liste2 = gtk_container_get_children(GTK_CONTAINER(GTK_BOX(pBox)));
        pItemFromBox = g_list_nth_data(liste2, 1);  // On pointe sur le 2eme element, le premier etant l'image
     
     
        sButtonName=gtk_label_get_label(GTK_LABEL(pItemFromBox));
        printf("\n%s",sButtonName);         // affichage du label associé au bouton
    }

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Marmoccelle
    Une nouvelle fois merci pour ton aide

    Je n'avais pas du tout pensé a une telle méthode. En fait j'avais dans l'idée ce type de fonctionnement:

    Dans la fonction callback, je récupere le label du bouton ("connexion" ou "deconnexion").
    Ensuite:
    => Si label=="connexion": Changer le label pour "deconnexion" et changer l'image en GTK_STOCK_DISCONNECT.
    => Sinon Changer le label en "connexion" et changer l'image en GTK_STOCK_CONNECT
    C'est une idée mais avec pas mal de manipulations à effectuer avant de pouvoir mettre à jour ton bouton.


    Citation Envoyé par Marmoccelle
    Sinon j'ai trouvé une méthode pour récuperer le label, en utilisant les listes chainées, dis moi ce que tu en penses stp (en tout cas j'arrive bien a récuperer/afficher le label du bouton)

    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
     
    void OnConnect(GtkWidget *pWidget, gpointer pData)
    {
        gchar *sButtonName;
     
     
        gpointer pBox,pItemFromBox;
        GList *liste = NULL;
        GList *liste2=NULL;
     
     
        liste = gtk_container_get_children(GTK_CONTAINER(GTK_BUTTON(pWidget)));
        pBox = g_list_nth_data(liste, 0);       // Le bouton contient 1 seul Widget => la hbox
     
        liste2 = gtk_container_get_children(GTK_CONTAINER(GTK_BOX(pBox)));
        pItemFromBox = g_list_nth_data(liste2, 1);  // On pointe sur le 2eme element, le premier etant l'image
     
     
        sButtonName=gtk_label_get_label(GTK_LABEL(pItemFromBox));
        printf("\n%s",sButtonName);         // affichage du label associé au bouton
    }
    C'est la seule solution possible si tu ne garde pas de trace de tes pointeurs. Pour éviter ceci, dans la structure que je t'ai proposé plus haut, rien ne t'empêches par exemple d'également ajouter un pointeur sur le GtkLabel, tu gagnes encore plus de temps alors
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Franck.H

    C'est la seule solution possible si tu ne garde pas de trace de tes pointeurs. Pour éviter ceci, dans la structure que je t'ai proposé plus haut, rien ne t'empêches par exemple d'également ajouter un pointeur sur le GtkLabel, tu gagnes encore plus de temps alors

    Euh en fait je vois pas trop comment faire pour ajouter dans cette structure un pointeur vers le label du bouton, puisque celui est contenu dans une HBox, elle meme contenue dans le bouton.


    Par contre concernant le "mnemonic" du bouton, il suffisait simplement de créer un label avec "mnemonic" (tk_label_new_with_mnemonic() dans la fonction AddButton(), car dans le GtkAccelGroup, on peut créer des "raccourcis" clavier, mais c'est orienté "menu" (exemple Ctrl+p, Ctrl+q, etc...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Description
    A GtkAccelGroup represents a group of keyboard accelerators, typically attached to a 
    toplevel GtkWindow (with gtk_window_add_accel_group()). Usually you won't need to create a 
    GtkAccelGroup directly; instead, when using GtkItemFactory, GTK+ automatically sets up 
    the accelerators for your menus in the item factory's GtkAccelGroup. 
    
    Note that accelerators are different from mnemonics. Accelerators are shortcuts 
    for activating a menu item; they appear alongside the menu item they're a shortcut for. 
    For example "Ctrl+Q" might appear alongside the "Quit" menu item. Mnemonics are shortcuts for 
    GUI elements such as text entries or buttons; they appear as underlined characters. 
    See gtk_label_new_with_mnemonic(). Menu items can have both accelerators and mnemonics, of course.
    Encore merci pour ton aide

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Marmoccelle
    Euh en fait je vois pas trop comment faire pour ajouter dans cette structure un pointeur vers le label du bouton, puisque celui est contenu dans une HBox, elle meme contenue dans le bouton.
    Tu n'as peut-être pas bien saisie ce que je voulais dire... Ca donnerais ceci dans la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct
    {
       int state;
       GtkWidget * p_button;   /* Le bouton. */
       GtkWidget * p_label;     /* Le label du bouton. */
    }
    ConnectButton;
    Voilà !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

Discussions similaires

  1. [WB12] Modifier l'image d'un bouton
    Par thierryG dans le forum WebDev
    Réponses: 4
    Dernier message: 10/12/2008, 17h52
  2. Boutons radio pour modifier une image
    Par method_man dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/04/2008, 21h01
  3. Réponses: 5
    Dernier message: 10/01/2007, 09h52
  4. [CSS] Modifier la taille de mon image pour mon bouton
    Par bouchette63 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 11/08/2006, 10h15
  5. Modifier l'image de fond d'un bouton lors du survol
    Par frechy dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 28/12/2005, 13h12

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