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 :

[gtk_image et gtk_button] Une image pour plusieurs boutons.


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut [gtk_image et gtk_button] Une image pour plusieurs boutons.
    Bien le bonsoir.
    Dans le cadre d'un projet, je dois réaliser un jeu d'Othello (dérivé du reversi). À savoir un jeu de pions, avec des pions noirs et des pions blancs.

    Afin de représenter mon damier et mes pions, j'ai choisi la facilité : un tableau de boutons à deux dimensions. Je mettrai ensuite dans ces boutons une image représentant -au choix- soit le pion noir, soit le pion blanc.

    Mon souci :
    Il semblerait que je ne puisse utiliser une image que dans un seul bouton à la fois.
    Je n'ai pas bien envie de créer 128 images (deux pour chacune des 64 cases du damier), il doit sans douter exister une solution plus élégante et c'est pour cela que j'en appelle à vos avis éclairés.

    Un peu de code maintenant, pour vous aider à cerner mon problème...

    J'ai déclaré mes deux images comme gtk_image_new_from_file(), rien d'anormal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    img_noir = gtk_image_new_from_file("etc/noir.png");
    img_blanc = gtk_image_new_from_file("etc/blanc.png");
    Ensuite, je construit mon tableau. Les widgets grille_vbox et grille_hbox[] sont les conteneurs qui structurent ma grille.
    Chaque bouton est créé comme gtk_button_new().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    grille_vbox = gtk_vbox_new(TRUE, 0);
    gtk_box_pack_start(GTK_BOX(fenetre_vbox), grille_vbox, TRUE, TRUE, 5);
     
    for(i=0; i<8; i++)
    {
    	grille_hbox[i] = gtk_hbox_new(TRUE, 2);
    	gtk_box_pack_start(GTK_BOX(grille_vbox), grille_hbox[i], TRUE, TRUE, 1);
     
    	for(j=0; j<8; j++)
    	{
    		cases[j][i] = gtk_button_new();
    		gtk_box_pack_start(GTK_BOX(grille_hbox[i]), cases[j][i], TRUE, TRUE, 1);
    	} 
    }
    Tous mes boutons sont contenus dans un tableau de GtkWidget* cases[][]. Je souhaite alors ajouter les images dans les 4 cases centrales, comme le veut la règle du jeu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gtk_button_set_image(GTK_BUTTON(cases[3][3]), img_blanc);
    gtk_button_set_image(GTK_BUTTON(cases[4][3]), img_noir);
    gtk_button_set_image(GTK_BUTTON(cases[3][4]), img_noir);
    gtk_button_set_image(GTK_BUTTON(cases[4][4]), img_blanc);
    Le problème intervient ici, seuls les boutons en [3][4] et [4][4] ont leur image.
    À chaque fois que j'essaie d'utiliser une de mes deux images sur un nouveau bouton, l'image va sur le nouvel emplacement et s'efface du précédent.


    Voici donc mes petits soucis. Pas le problème du siècle, mais mes recherches n'ont pas abouti.
    Merci d'avance !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Il me semble que ce code pourrait t'aider :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     #include <gtk/gtk.h>
     
    GdkPixbuf *load_released_button_bitmap()
    {
        GdkPixbuf *src_pixbuf=NULL;
        GdkPixbuf *dest_pixbuf=NULL;
     
        src_pixbuf=gdk_pixbuf_new_from_file("./buttons.bmp", NULL);
        if (src_pixbuf)
        {
            dest_pixbuf=gdk_pixbuf_new_subpixbuf(src_pixbuf, 171, 0, 30, 30);
            g_object_unref(src_pixbuf);
        }
        else
            printf("Chargement de l'image echoué.\n");
     
        return dest_pixbuf;
    }
     
    GdkPixbuf *load_pressed_button_bitmap()
    {
        GdkPixbuf *src_pixbuf=NULL;
        GdkPixbuf *dest_pixbuf=NULL;
     
        src_pixbuf=gdk_pixbuf_new_from_file("./buttons.bmp", NULL);
        if (src_pixbuf)
        {
            dest_pixbuf=gdk_pixbuf_new_subpixbuf(src_pixbuf, 201, 0, 30, 30);
            g_object_unref(src_pixbuf);
        }
        else
            printf("Chargement de l'image echoué.\n");
     
        return dest_pixbuf;
    }
     
    void CMouse_on_button(GtkButton *bouton, GdkPixbuf *pressed_image_button)
    {
        gtk_button_set_image(bouton, gtk_image_new_from_pixbuf(pressed_image_button));
    }
     
    void CMouse_out_button(GtkButton *bouton, GdkPixbuf *released_image_button)
    {
        gtk_button_set_image(bouton,gtk_image_new_from_pixbuf(released_image_button));
    }
     
    void init_window()
    {
        GtkWidget *fenetre_principale=NULL;
        GtkWidget *bouton=NULL;
        GdkPixbuf *pressed_image_button=NULL;
        GdkPixbuf *released_image_button=NULL;
     
        // Chargement des bitmaps du bouton
        pressed_image_button=load_pressed_button_bitmap();
        released_image_button=load_released_button_bitmap();
     
        /* création de la fenêtre principale */
        fenetre_principale=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(fenetre_principale), "test bitmap");
     
        // Création d'un bouton graphique
        bouton=gtk_button_new();
        gtk_button_set_image(GTK_BUTTON(bouton),
                                                                gtk_image_new_from_pixbuf(released_image_button));
        gtk_container_add(GTK_CONTAINER(fenetre_principale), bouton);
     
        /* Affectation des signaux lors du clic et relaché sur le bouton pour changer
        l'image du bouton.*/
        g_signal_connect(G_OBJECT(bouton), "pressed",
                                                            (GCallback)CMouse_on_button, pressed_image_button);
        g_signal_connect(G_OBJECT(bouton), "released",
                                                        (GCallback)CMouse_out_button, released_image_button);
     
        // Affection des signaux pour fermeture de l'application
        g_signal_connect(G_OBJECT(fenetre_principale), "destroy",
                                                                                                    (GCallback)gtk_main_quit, NULL);
     
        // Affichage de la fenêtre
        gtk_widget_show_all(fenetre_principale);
    }
     
    gint main(gint argc,gchar **argv)
    {
        gtk_init(&argc, &argv);
     
        init_window();
     
        gtk_main();
     
        return 0;
    }

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Un GtkImage est un widget, il dérive de GtkWidget.
    gtk_button_set_image(bouton, image) indique que le GtkImage nommé "image" devient le fils du GtkButton nommé "bouton".

    Or un widget peut avoir plusieurs enfants, mais un seul parent. Et là tu essaie de donner plusieurs parents à chacun de tes GtkImage.

    Solution possible à mon avis (je n'ai pas testé) :
    1. créer un buffer pixel (GdkPixbuf) par image à afficher, en l'occurrence une pour ton pion blanc et une pour ton pion noir, avec gdk_pixbuf_new_from_file.
    2. créer un GtkImage par GtkButton, et les associer avec gtk_button_set_image
    3. changer l'image à afficher avec gtk_image_set_from_pixbuf.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci bien de vos réponses.
    L'emploi d'un GdkPixbuf a convenu parfaitement à la situation.

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

Discussions similaires

  1. [Débutant] découper une image pour faire plusieurs "capteurs"
    Par vanilou dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 06/07/2012, 15h35
  2. Réponses: 16
    Dernier message: 06/06/2007, 19h49
  3. test champs email avec une image pour bouton de validation
    Par becouet dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/06/2006, 00h17
  4. utiliser des morceaux d'une image pour faire des boutons
    Par Battosaiii dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 14/12/2005, 01h05
  5. [FLASH 5]un bouton dans une image pour revenir sur une scene
    Par patato valdes dans le forum Flash
    Réponses: 7
    Dernier message: 28/04/2004, 21h21

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