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 :

probleme avec 1 bouton et une fenetre


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Par défaut probleme avec 1 bouton et une fenetre
    slt j'ai commencé hier l'apprentissage de GTK avec c::b mais il y a 2 trucs qui m'ont coincé. primo ,mon programme affiche une fentre avec des boutons qui font chacuns un truc,et parmi eux il y a un boutons qui ouvre une fentre , si j'appuye dessus 1 fois la fenetre s'ouvre mais lrq je re appuye encore ça affiche une erreur dans la console et rien ne se passe .
    Secondo ,depuis que j'ai affecté une image au bouton "quitter" il n y qu'un ptit bout du bouton qui est affiché .
    voila le code et svp expliquer moi en detail si possible comment le reparer.
    merci
    ps:tant que j'y suis on fait cmt pour augmenter la taille d'un bouton ?
    c'est possible de jouer un son avec gtk ?

    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    #include <stdio.h>
    #include <stdlib.h>
    #include <assert.h>
     
    #include <gtk/gtk.h>
     
     
     
    GtkWidget* creer_bouton(char *nom_bouton);
    GtkWidget *status_bar=NULL;
    void ajout_bouton_quitter(GtkWidget *panier,GtkWidget *bouton);
     
     
    void message_quitter(GtkWidget *pButton, gpointer context1);
    void message_about(GtkWidget *pButton, gpointer context);
    void message_charger(GtkWidget *pButton, gpointer context);
    void message_calculer(GtkWidget *pButton, gpointer context);
    void message_verifier(GtkWidget *pButton, gpointer context);
    void message_machine(GtkWidget *pButton, gpointer context);
    void ouvrir();
    void vider_pile(GtkWidget *pButton, gpointer context1);
    void charger_les_fichiers();
    void lancer_boite(void);
    //declaration de la fentre principale MainWindow
    GtkWidget * MainWindow=NULL,*SmallWindow=NULL;
     
    static GtkWidget *pLabel;
    int main(int argc, char **argv)
    {
        /* Variables */
     
        GtkWidget *Texte=NULL,*Container_Texte=NULL;
        GtkWidget *boite_dialogue=NULL;
        GtkWidget *panier=NULL,*bouton[6],*panier1=NULL;
     
        guint context_quitter,context_charger,context_about,context_calculer;
        guint context_verifier,context_machine;
        int i;
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);//initialisation GTK
     
        /* Création de la fenêtre  principale*/
        MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        //affectation du titre de MainWindow
        gtk_window_set_title ( GTK_WINDOW(MainWindow), "Gestion entreprise");
        //taille de la fenetre 500*500
        gtk_window_set_default_size(GTK_WINDOW(MainWindow),500,500);
        //position de la fentre par defaut
        gtk_window_set_position(GTK_WINDOW(MainWindow),GTK_WIN_POS_CENTER);
        /* Création de la fenêtre  principale*/
        SmallWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        //affectation du titre de SmallWindow
        gtk_window_set_title ( GTK_WINDOW(SmallWindow), "Calcul des Couts");
     
        //taille de la fenetre 250*250
        gtk_window_set_default_size(GTK_WINDOW(SmallWindow),250,250);
        //position de la fentre par defaut
        gtk_window_set_position(GTK_WINDOW(SmallWindow),GTK_WIN_POS_CENTER);
       // g_signal_connect(G_OBJECT(SmallWindow), "destroy", G_CALLBACK(), NULL);
    //******* creation des boutons de la fentre principale*******//
        bouton[0] =gtk_button_new_with_mnemonic("_Charger les fichiers");
        bouton[1]=gtk_button_new_with_mnemonic("calcul _des couts");// //probleme de la fenetre avec ce bouton "calcul des couts"
        bouton[2]=gtk_button_new_with_mnemonic("_Verifier la section d'un produit");
        bouton[3]=gtk_button_new_with_mnemonic("_Machines inutiles");//ne fait //rien
        bouton[4]=gtk_button_new_with_mnemonic("_A propos");//ne fait rien
        bouton[5]=gtk_button_new_with_mnemonic("_Quitter");
        bouton[5] = gtk_button_new_from_stock(GTK_MESSAGE_INFO);
    //probleme de la fenetre avec ce bouton quasi invisible
     
        g_signal_connect(G_OBJECT(bouton[0]), "clicked", G_CALLBACK(charger_les_fichiers)
        , NULL);
        g_signal_connect(G_OBJECT(bouton[1]), "clicked", G_CALLBACK(ouvrir), NULL);
        g_signal_connect(G_OBJECT(bouton[5]), "clicked", G_CALLBACK(gtk_main_quit), NULL);
     
     
     
        panier=gtk_vbox_new(TRUE, 0);
        for (i=0;i<6;i++)
        {
            gtk_box_pack_start(GTK_BOX(panier),bouton[i],TRUE,FALSE,5);
        }
     
        //creation de la barre d'etat
        status_bar=gtk_statusbar_new();
     
        context_quitter = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar), "sur_bouton_quitter");
        context_charger=gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),"sur_bouton_charger");
        context_about=gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar),"sur_bouton_about");
     
        //rattachement des signaux au different bouton pour la barre d'etat
        g_signal_connect(G_OBJECT(bouton[0]), "enter", G_CALLBACK(message_charger),
        GINT_TO_POINTER(context_charger));
        g_signal_connect(G_OBJECT(bouton[1]), "enter", G_CALLBACK(message_calculer),
        GINT_TO_POINTER(context_calculer));
        g_signal_connect(G_OBJECT(bouton[2]), "enter", G_CALLBACK(message_verifier),
        GINT_TO_POINTER(context_verifier));
        g_signal_connect(G_OBJECT(bouton[3]), "enter", G_CALLBACK(message_machine),
        GINT_TO_POINTER(context_machine));
        g_signal_connect(G_OBJECT(bouton[4]), "enter", G_CALLBACK(message_about),
        GINT_TO_POINTER(context_about));
     
        g_signal_connect(G_OBJECT(bouton[5]), "enter", G_CALLBACK(message_quitter),
        GINT_TO_POINTER(context_quitter));
     
     
     
     
        g_signal_connect(G_OBJECT(bouton[0]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_charger));
        g_signal_connect(G_OBJECT(bouton[1]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_calculer));
        g_signal_connect(G_OBJECT(bouton[2]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_verifier));
        g_signal_connect(G_OBJECT(bouton[3]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_machine));
        g_signal_connect(G_OBJECT(bouton[4]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_about));
     
        g_signal_connect(G_OBJECT(bouton[5]), "leave", G_CALLBACK(vider_pile),
            GINT_TO_POINTER(context_quitter));
     
     
     
     
     
     
        //ajout de la barre d'etat dans le panier
        gtk_box_pack_end(GTK_BOX(panier), status_bar, FALSE, FALSE, 0);
     
       // g_signal_connect(G_OBJECT(bouton[2]), "enter", G_CALLBACK(souris_sur_quitter),
        //GINT_TO_POINTER(souris_in));
         //g_signal_connect(G_OBJECT(bouton[2]), "leave", G_CALLBACK(vider_pile),
           // GINT_TO_POINTER(souris_in));
     
       // g_signal_connect(G_OBJECT(bouton[2]),"enter", G_CALLBACK(souris_sur_quitter),
         //   GINT_TO_POINTER(souris_in));
        //g_signal_connect(G_OBJECT(bouton[2]), "leave", G_CALLBACK(vider_pile),
          //  GINT_TO_POINTER(souris_out));
     
        gtk_container_add(GTK_CONTAINER(MainWindow),panier);
     
     
     
        //ça a un rapport avec la taille du bouton a voir
        gtk_container_set_border_width(GTK_CONTAINER(MainWindow),100);//
     
        g_signal_connect(G_OBJECT(MainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
    //connexion de l'evenement "delete-event" avec la fenetre MainWindow
        //si cet evementen est detecté la fenetre sera fermé
      // g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(gtk_main_quit), SmallWindow);
     
        //get_window_set_default_size(SmallWindow,100,100);
        //gtk_window_set_position(MainWindow,GTK_WIN_POS_LEFT);
     
        gtk_widget_show_all(MainWindow);
        gtk_main();
        //g_free(MainWindow);
     
        /* Fermeture de GTK+ */
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
     
     
     
    void charger_les_fichiers(void)
    {
        GtkWidget* pBoite;
        GtkWidget* pEntry;
     
    /* inutilie ici
        //chargement des fichiers
     
        fichier_article=ouvrir_fichier_article();
        fichier_procede=ouvrir_fichier_procede();
        fichier_machine=ouvrir_fichier_machine();
        fichier_section=ouvrir_fichier_section();
        l_a=charger_fichier_article(fichier_article);
        l_m=charger_fichier_machine(fichier_machine);
        l_s=charger_fichier_section(fichier_section);
        p=charger_fichier_procede(fichier_procede);
     
    */
        pBoite=gtk_dialog_new_with_buttons("Chargement",GTK_WINDOW(MainWindow)
        ,GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_OK,NULL);
     
          pBoite=gtk_message_dialog_new (MainWindow,GTK_DIALOG_MODAL ,GTK_MESSAGE_INFO
        ,GTK_BUTTONS_CLOSE,"Chargement reussi !");
        }
     
        /* Creation de la boite de dialogue */
        /* 1 bouton Valider */
     
     
     
        /* Insertion de la zone de saisie dans la boite de dialogue */
        /* Rappel : paramètre 1 de gtk_box_pack_start de type GtkBox */
     
       // gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pBoite)->vbox), , FALSE, 0);
     
        /* Affichage des elements de la boite de dialogue */
        gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);
        gtk_dialog_run(GTK_DIALOG(pBoite));
     
        /* Destruction de la boite de dialogue */
        gtk_widget_destroy(pBoite);
    }
    void message_quitter(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context), "Quitter l'application");
    }
    void message_charger(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context),
        "Charge les fichiers de l'application.");
    }
    void message_about(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context),
        "A propos de Gestion Entreprise.");
    }
    void message_calculer(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context),
        "Calcule le cout matiere et amortissement d'un produit .");
    }
    void message_verifier(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context),
        "verifie si un produit est present dans une section");
    }
    void message_machine(GtkWidget *pButton, gpointer context)
    {
        /* Ajout d'un message */
        gtk_statusbar_push (GTK_STATUSBAR (status_bar), GPOINTER_TO_INT(context),
        "affiche les machines inutiles");
    }
     
    void vider_pile(GtkWidget *pButton, gpointer context1)
    {
        /* Suppression d'un message qui a pour identifiant context1*/
        gtk_statusbar_pop(GTK_STATUSBAR(status_bar), GPOINTER_TO_INT(context1));
    }
    void ouvrir()
    {
     
        printf("%d\n",SmallWindow);
        gtk_widget_show_all(SmallWindow);
        gtk_widget_show_all(SmallWindow);
    }

  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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bon ca va être un peu long alors faut bien tout lire et pas désespérer


    Commençons par le commencement ... les variables globales c'est pas une pratique conseillée d'autant plus que sur un petit projet comme ca c'est très simple de les éviter, le passage de paramètres aux fonctions est là justement pour ca !

    Ensuite, parlons de ton code ! Toute la portion de code suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        SmallWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        //affectation du titre de SmallWindow
        gtk_window_set_title ( GTK_WINDOW(SmallWindow), "Calcul des Couts");
     
        //taille de la fenetre 250*250
        gtk_window_set_default_size(GTK_WINDOW(SmallWindow),250,250);
        //position de la fentre par defaut
        gtk_window_set_position(GTK_WINDOW(SmallWindow),GTK_WIN_POS_CENTER);
    Il faut la mettre dans la fonction "ouvrir". Parlons justement de ta fonction ouvrir que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void ouvrir()
    {
     
        printf("%d\n",SmallWindow);
        gtk_widget_show_all(SmallWindow);
        gtk_widget_show_all(SmallWindow);
    }
    Je ne vois franchement pas l'utilité du printf ici, je ne vois pas trop ce que tu as essayé de faire donc à supprimer de même qu'un appel à gtk_widget_show_all ... un seul appel suffit ! D'ailleur, je te conseil de ne pas créer une fenêtre de ce type mais plutôt une simple boîte de dialogue. La règle veut qu'on dispose d'une GtkWindow et que les autres fenêtre nommées souvent Popup Windows soient des GtkDialog !

    Toujours dans ta fonction ouvrir, si c'est un callback et comme ca à l'air d'être le cas, il faut respecter la signature des callback soit pour ton callback ouvrir la signature suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void ouvrir(GtkWidget * pButton, gpointer context);
    et de même pour les autres callback dont tu ne respecte pas la signature !

    Avançons maintenant un ptit peu ... Pour le problème de l'icône de ton bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bouton[5] = gtk_button_new_from_stock(GTK_MESSAGE_INFO);
    Tu t'es trompé dans le nom de la constante, c'est GTK_STOCK_INFO !

    Dans ta fonction charger_les_fichiers, cette ligne est inutile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_show_all(GTK_DIALOG(pBoite)->vbox);
    car la fonction suivante que tu appelles soit gtk_dialog_run s'occupe de l'affichage


    Voilà c'est à peu près tout ... Si juste faire un petit effort de présentation du code car y'a beaucoup de commentaires et donc de ce fait beaucoup de variables non utilisées !
    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. [FLASH MX] Probleme avec un bouton flash
    Par kgadhi dans le forum Flash
    Réponses: 8
    Dernier message: 02/12/2005, 14h06
  2. Probleme de Resize "proportionnel" d'une fenetre
    Par biloute2121 dans le forum MFC
    Réponses: 3
    Dernier message: 24/11/2005, 10h20
  3. Réponses: 3
    Dernier message: 22/11/2005, 20h42
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25

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