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 :

Affichage de fenêtre définie dans une structure


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 38
    Par défaut Affichage de fenêtre définie dans une structure
    Bonjour à tous

    Je vous remercie tous d'abord, vous qui prenez le temps de me lire

    Voici mon problème

    J'ai une grosse Fenêtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct{
    GtkWidget* pWindow;
    GtkWidget* pTable;
    GtkWidget *pLabel[16];
    GtkWidget *pImage[64];
    GtkWidget *pBox[64];
    GtkWidget *pButton[64];
    gchar *sUtf8;
    }WindowJeu;
    Que j'initialise a partir d'un code ...

    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
    WindowJeu initialisationfenetre()
    {
    /* Déclaration Variable */
    WindowJeu pWindow;
    int i,j, compteurblanc,compteurnoir,compteurinitblanc,compteurinitnoire;
    compteurblanc =0;
    compteurnoir =32;
    piece pieceBlanche[16];
    compteurinitblanc = 0;
    piece pieceNoire[16];
    compteurinitnoire = 0;
     
    gtk_window_set_title(GTK_WINDOW(pWindow.pWindow),"Jeu");
    gtk_window_set_default_size(GTK_WINDOW(pWindow.pWindow),500,500);
    g_signal_connect(G_OBJECT(pWindow.pWindow),"destroy",G_CALLBACK(gtk_main_quit),0);
    gtk_container_add(GTK_CONTAINER(pWindow.pWindow), GTK_WIDGET(pWindow.pTable));
     
        for(i =0; i<16;i++)
        {
            pWindow.pLabel[i]=gtk_label_new(NULL);
        }
    pWindow.pTable=gtk_table_new(9,9,FALSE);
        for(i=0; i<32;i++)
        {
            pWindow.pImage[i] = gtk_image_new_from_file("./blanc.png");
        }
        for(i=32; i<64;i++)
        {
            pWindow.pImage[i] = gtk_image_new_from_file("./noir.png");
        }
        for(i =0 ; i<64; i++)
        {
            pWindow.pButton[i] = gtk_button_new ();
            pWindow.pBox[i] = gtk_hbox_new (FALSE, 2);
            gtk_container_add (GTK_CONTAINER (pWindow.pButton[i]), pWindow.pBox[i]);
            gtk_box_pack_start (GTK_BOX (pWindow.pBox[i]), pWindow.pImage[i], TRUE, TRUE, 0);
        }
        pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>1</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[0]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>2</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[1]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>3</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[2]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>4</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[3]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>5</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[4]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>6</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[5]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>7</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[6]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>8</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[7]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>8</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[7]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>A</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[8]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>B</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[9]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>C</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[10]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>D</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[11]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>E</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[12]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>F</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[13]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>G</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[14]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
    pWindow.sUtf8 = g_locale_to_utf8("<span face=\"Sans\" size=\"16\"><u>H</u></span>",-1, NULL, NULL, NULL);
         gtk_label_set_markup(GTK_LABEL(pWindow.pLabel[15]), pWindow.sUtf8);
         g_free(pWindow.sUtf8);
         for(i=0; i<8;i++)
            {
            gtk_table_attach(GTK_TABLE(pWindow.pTable), pWindow.pLabel[i],
                     0, 1, i, i+1,
                     GTK_EXPAND , GTK_EXPAND,
                     0, 0);
            }
        for(i=0; i<8;i++)
            {
                gtk_table_attach(GTK_TABLE(pWindow.pTable), pWindow.pLabel[i+8],
                     i+1, i+2, 8, 9,
                     GTK_EXPAND, GTK_EXPAND,
                     0, 0);
            }
            for(i=0; i<8;i++)
            {
                for(j=0; j<8;j++)
                    {
                        if((j+i)%2==0)
                        {
     
     
                            gtk_table_attach_defaults(GTK_TABLE(pWindow.pTable), pWindow.pButton[compteurblanc],i+1, i+2, j, j+1);
                            compteurblanc ++;
                            printf("\n%d",compteurblanc);
                            if(j<2 && i<8)
                               {
                                    gtk_image_set_from_file(GTK_IMAGE(pWindow.pImage[compteurblanc-1]), "./pionNb.png");
                                    pieceNoire[compteurinitnoire].positionX = i;
                                    pieceNoire[compteurinitnoire].positionY = j;
                                    printf("Pièce Noire (%d : %d )\n",pieceNoire[compteurinitnoire].positionX,pieceNoire[compteurinitnoire].positionY);
                                    compteurinitnoire++;
                               }
                            if(((j>=6) && (j<=8) &&(i<8)))
                            {
                                gtk_image_set_from_file(GTK_IMAGE(pWindow.pImage[compteurblanc-1]), "./pionBb.png");
                                pieceBlanche[compteurinitblanc].positionX = i;
                                pieceBlanche[compteurinitblanc].positionY = j;
                                printf("Pièce blanche (%d : %d )\n",pieceBlanche[compteurinitblanc].positionX,pieceBlanche[compteurinitblanc].positionY);
                                compteurinitblanc++;
                            }
     
                        }
                        else
                        {
                            gtk_table_attach_defaults(GTK_TABLE(pWindow.pTable), pWindow.pButton[compteurnoir],i+1, i+2, j, j+1);
                            compteurnoir ++;
                             printf("\n%d",compteurnoir);
                             if(j<2 && i<8)
                               {
                                    gtk_image_set_from_file(GTK_IMAGE(pWindow.pImage[compteurnoir-1]), "./pionNn.png");
                                    pieceNoire[compteurinitnoire].positionX = i;
                                    pieceNoire[compteurinitnoire].positionY = j;
                                    printf("Pièce Noire (%d : %d )\n",pieceNoire[compteurinitnoire].positionX,pieceNoire[compteurinitnoire].positionY);
                                    compteurinitnoire++;
                               }
                            if(((j>=6) && (j<=8) &&(i<8)))
                            {
                                gtk_image_set_from_file(GTK_IMAGE(pWindow.pImage[compteurnoir-1]), "./pionBn.png");
                                pieceBlanche[compteurinitblanc].positionX = i;
                                pieceBlanche[compteurinitblanc].positionY = j;
                                printf("Pièce blanche (%d : %d )\n",pieceBlanche[compteurinitblanc].positionX,pieceBlanche[compteurinitblanc].positionY);
                                compteurinitblanc++;
                            }
                        }
                    }
                    printf("\nDone\n");
            }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void fenetrejeu()
    {
    
    WindowJeu Window;
    Window = initialisationfenetre() ;
    
    
    gtk_widget_show_all(Window.pWindow);
    gtk_main();
    
    }
    Voici mes questions :
    1°) mon code est assez long pour la fenetre, existe un moyen de le réduire ?
    2°) lors que j'essai d'afficher la fenêtre avec la commande gtk gtk_widget_show_all(Window.pWindow);, le programme bug, et il m'indique que le programme a cessé de fonctionné.
    3°) Enfin ( cette question n'est pas la prioritaire ), il existe-t-il un moyen, lorsqu'on, clique sur un des bouton de faire bougé l'image qui lui est associé, je pense notamment au image pour les pions.

    Je remercie encore une fois tous ceux qui auront le courage de me lire ...

    Cordialement

  2. #2
    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
    Qu'est-ce que tu fais comme jeu, un jeu de dames, d'échecs, un othello ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 38
    Par défaut
    Bonjour

    Il s'agit d'un jeu d’échec simplifier ... ( avec uniquement des pions 16 par couleurs )

  4. #4
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Bonjour,
    Il est difficile de t'aider efficacement sans avoir un programme autonome.
    En ajoutant une structure "piece", puis en transformant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // WindowJeu initialisationfenetre()
    void initialisationfenetre()
    car elle ne retourne aucune valeur, et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //void fenetrejeu()
    int main(int argc,char **argv),
    puis en rajoutant
    on trouve que le widget pWindow.pWindow n'est pas défini...

    Je pense qu'au lieu de répéter 16 fois la même séquence tu as intérêt à définir un tableau de caractères (nom[16] par exemple) 1 à 9 et A à H et de faire une boucle avec un sprintf (..., nom[i]);
    dans un buffer utilisé comme argument de g_locale_to_utf8().

    Je me demande pourquoi tu déclare en tableaux pieceBlanche et pieceNoire sachant que ce sont des variable locales qui ne peuvent être utilisées qu'a l'intérieur de la fonction.
    Je me permet de rajouter une règle de base: compiler le plus souvent possible, dès que l'on écrit quelque chose: les messages du compilateur sont une aide inestimable et le débutant à toujours tendance à écrire trop de lignes avant d'essayer de compiler.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2012
    Messages : 38
    Par défaut
    Bonjour pvincent

    Merci pour ton message, cependant quelque précision :

    Je peux fournir le code en entier.

    Ma fenêtre comporte pas mal de widget, et par la fonction

    initialisationfenetre() je souhaiterai la crée en faite.

    Et puis la retourné afin de la de l'afficher dans fenetrejeu()

    Ce que je n'ai pas dit, c'est que j'ai d'autre fenêtre et que celle la n'est qu'une fenêtre parmi les autres que j'appelle en cliquant sur un bouton.

    Le problème c'est comment je dois faire pour que dans la fonction fenetrejeu() lors que j'utilise gtk_widget_show_all, cela m'affiche la fenetre que j'ai initialisé dans la fonction initialisation fenetre et qui est une fenetre du type.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct{
    GtkWidget* pWindow;
    GtkWidget* pTable;
    GtkWidget *pLabel[16];
    GtkWidget *pImage[64];
    GtkWidget *pBox[64];
    GtkWidget *pButton[64];
    gchar *sUtf8;
    }WindowJeu;
    Cordialement
    Fichiers attachés Fichiers attachés

  6. #6
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Après un premier essai, en utilisant un debogueur (nemiver ou ddd), on voit que ça plante sur la ligne 20 tout simplement parce que pWindow.pWindow n'est pas définie.
    En effet pWindow (la structure) est déclarée localement dans la fonction initialisationfenetre() sans que ses membres ne soit définis dans celle-ci.
    Si tu veux te servir de cette fenêtre ailleurs que dans cette fonction, il faudra prévoir de passer la structure en argument dans la fonction.
    Au passage, ce n'est pas terrible de donner le même nom à une structure et à un de ses membres: il vaut mieux être plus expressif.

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

Discussions similaires

  1. Problème d'affichage d'un tableau dans une fenêtre
    Par barney_vegeta dans le forum NetBeans
    Réponses: 4
    Dernier message: 03/05/2012, 18h56
  2. Affichage d'un texte dans une fenêtre
    Par Aminesrine dans le forum Débuter
    Réponses: 6
    Dernier message: 24/03/2011, 20h52
  3. [eZ Publish] Affichage par cellule défini dans une table
    Par lordlifen dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 28/06/2010, 18h03
  4. Réponses: 2
    Dernier message: 16/04/2010, 08h29
  5. type void* dans une structure
    Par barbapapaz dans le forum C
    Réponses: 3
    Dernier message: 16/07/2004, 16h11

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