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 :

afficher et changer d'image


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Par défaut afficher et changer d'image
    Bonjour

    Je cherche depuis quelques jours a afficher et changer une image en appuyant sur un bouton ou bien en passant par une variable.
    L'image que je désire afficher me semble assez simple genre une led ou bien un carré au format standard (png) et faisant moins de 1ko.
    En utilisant la fonction led = gtk_image_new_from_file ("./led_off.png"); cela fonctionne évidement. Mais je voudrais (par exemple ) mettre en mémoire led_on.png ou led off.png, puis afficher une des 2 images mémorisée.

    Je n'arrive pas a trouver les fonction ou les bibliothèque que je dois utiliser : gtkImage, ou bien gdkpixbuff ?
    Bien entendu j'ai lu votre tutoriel http://gtk.developpez.com/cours/gtk2/?page=page_11 et j'ai même essayé le widget que vous avez eu la sympathie de mettre a notre disposition ici http://franckh.developpez.com/tutori...eation-widget/

    Merci d'avance.

  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
    Bonjour.

    La solution réside dans les GdkPixbuf.

    Il suffit de charger les deux images dans des GdkPixbuf. Ces pointeurs devront persister en mémoire tout le temps nécessaire à l'utilisation du bouton.

    Ensuite il suffit de créer à volonté les GtkImage à partir de ces GdkPixbuf grâce à la fonction gtk_new_from_pixbuf();.

    Ainsi cela évite de charger à partir du disque les images à chaque appui sur le bouton et aussi de permettre d'écraser l'ancien GtkImage inséré dans le bouton par le nouveau sans se soucier de sa perte à ce moment là.

  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
    Par défaut
    Tout d'abord, charge tes images dans des GdkPixbuf, avec gdk_pixbuf_new_from_file.

    Pour créer une GtkImage à partir d'un GtkPixbuf, on utilise gtk_image_new_from_pixbuf. Pour ensuite modifier l'image, il faut utiliser gtk_image_set_from_pixbuf. Cela évite d'avoir à détruire/reconstruire des GtkImage. Tu utilises la même, tu en changes juste le contenu.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Par défaut
    Bonjour et merci a vous gerald3d et liberforce, je vais faire des essais a partir de vos réponses. Je vous tiens au courant.

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juin 2004
    Messages : 53
    Par défaut
    rere

    malgrès de multiples essai avec vos conseil je n'y arrive pas, vous pourrez essayer ce code qui n'est pas à 100% de ma part que j'ai écris avec codeblock 13.12
    A la ligne 68 je fais le test if (label <= 2) et si vous inversez le < par un > on obtient un changement de l'image après recompil et relancement du programme.

    Enfin suite au précédent post sur les gtkentry ben il semble y avoir une solution dans ce code (en tout cas ça fonctione sur mon linux)

    Voici le code :


    #include <gtk/gtk.h>
    #include <stdlib.h>

    gint label=0 ;

    typedef struct _Data StructDat;
    struct _Data
    {
    GtkLabel * LabelVar ;
    GtkWidget * lblEntry ;
    GdkPixbuf * led ;
    GdkPixbuf * ledON;
    GdkPixbuf * ledOFF;
    gchar * stringLBL ;
    };

    static void cb_unit (GtkButton *Button3, StructDat *data) {

    if (label > 255) { label =0;
    return; }

    else label = label + 1;

    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }


    static void cb_diz (GtkButton *Button2, StructDat *data) {
    if (label > 255) { label =0;
    return; }

    else label = label + 10;

    data->stringLBL = g_strdup_printf( "%03d", label );
    gtk_label_set_label( data->LabelVar, data->stringLBL );
    gtk_entry_set_text(GTK_ENTRY(data->lblEntry), data->stringLBL );
    g_free( data->stringLBL );
    }


    int main(int argc, char **argv)
    {
    gtk_init(&argc, &argv);

    GtkWidget *window, *table, *bunit, *bdiz, *etiquet, * ledAFF;

    StructDat *data;
    data = g_slice_new( StructDat);

    data->ledOFF = gdk_pixbuf_new_from_file ("./led_off.png", NULL);
    data->ledON = gdk_pixbuf_new_from_file ("./led_on.png", NULL);

    /* if (label <= 2) { data->led = data->ledON ; }
    else data->led = data->ledOFF ; */

    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_widget_set_size_request (window, 450, 250);
    gtk_window_set_title (GTK_WINDOW (window), " EssaiVariable");
    g_signal_connect( G_OBJECT( window ), "destroy", G_CALLBACK( gtk_main_quit ), NULL );

    table = gtk_table_new( 7, 7, FALSE ); // la table de base colones et puis lignes
    gtk_container_add( GTK_CONTAINER ( window ), table );


    if (label <= 2)
    {ledAFF = gtk_image_new_from_pixbuf(data->ledON) ,
    gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 ); }

    else ledAFF = gtk_image_new_from_pixbuf(data->ledOFF) ,
    gtk_table_attach( GTK_TABLE( table ), ledAFF, 6, 7, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    etiquet = gtk_label_new("variable");
    gtk_table_attach( GTK_TABLE( table ), etiquet, 4, 5, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0 );
    data->LabelVar = GTK_LABEL( etiquet );

    data->lblEntry = gtk_entry_new(); //_with_max_length(15);
    gtk_table_attach( GTK_TABLE( table ), data->lblEntry, 1, 4, 3, 4, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    bdiz = gtk_button_new_with_label( "Diz" );
    g_signal_connect( G_OBJECT( bdiz ), "clicked", G_CALLBACK ( cb_diz ), data);
    gtk_table_attach( GTK_TABLE( table ), bdiz, 3, 4, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    bunit = gtk_button_new_with_label( "Unit" );
    g_signal_connect( G_OBJECT( bunit ), "clicked", G_CALLBACK ( cb_unit ), data);
    gtk_table_attach( GTK_TABLE( table ), bunit, 4, 5, 4, 5, GTK_SHRINK, GTK_SHRINK, 0, 0 );

    gtk_widget_show_all( window );
    gtk_main();
    g_slice_free( StructDat, data );

    return EXIT_SUCCESS ;
    }

    En espérant qu'il y ai le moins d'erreur possible.

  6. #6
    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
    Bonjour.

    Pour plus de lisibilité pense à entourer ton code source des balises . Il suffit pour cela de sélectionner tout ton code source et de cliquer ensuite sur l'icône "#".

    Ceci dit, sans avoir essayer d'exécuter ton code, il faut changer l'image dans la fonction void cb_diz (GtkButton *Button2, StructDat *data);.

    Tu récupères dans cette fonction le pointeur data. Il te suffit simplement d'utiliser la fonction gtk_image_set_from_pixbuf(); comme te l'a indiqué LiberForce pour voir ta led changer .

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

Discussions similaires

  1. Changer l'image affichée dans le temp
    Par Elazael dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2008, 11h47
  2. Afficher tout type d'image (gif ,png, jpg...)
    Par jfb53 dans le forum C++Builder
    Réponses: 22
    Dernier message: 20/07/2005, 14h52
  3. Afficher et comparer 2 images bitmap
    Par leplusnul dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2004, 16h54
  4. changer l'image d'arrière plan du bureau
    Par etenclin dans le forum MFC
    Réponses: 7
    Dernier message: 22/08/2002, 15h54
  5. Changer l'image d'une texture
    Par alltech dans le forum DirectX
    Réponses: 5
    Dernier message: 21/08/2002, 01h31

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