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 :

Les paramètres d'un CALLBACK


Sujet :

GTK+ avec C & C++

Vue hybride

passpass Les paramètres d'un CALLBACK 05/05/2008, 02h33
valefor Ta fonction récupère un... 05/05/2008, 09h06
passpass Bonjour, Merci valefor !... 05/05/2008, 13h32
valefor Effectivement, mon exemple... 05/05/2008, 14h05
passpass Très bien. 05/05/2008, 14h17
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut Les paramètres d'un CALLBACK
    Bonsoir,
    Je débute totalement sous GTK+ et je bute sur un problème depuis quelque jour.

    J'aimerai que lorsque je clique sur un bouton, un dialogue s'ouvre avec pour informations les coordonnées du bouton cliqué. Pour cela je veux envoyer une structure comme paramètre de mon CALLBACK.
    Cette structure comporte deux int x et y ainsi que d'autres variables.

    Voila mon code actuel:
    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
     
    typedef struct{
            int x;
            int y;
     
    /* ...autre variable ... */
     
            }position;
     
     
    void OnDestroy(GtkWidget *pWidget, gpointer* pData)
    {
        gtk_main_quit();
    }
     
     
    void fct(GtkWidget *widget, gpointer Data)
    {
        GtkWidget *pAbout;
        GtkWidget *Fenetre;
     
    position* ba=(position*) Data;
       gint i = (gint)ba->x;
        gint j = (gint)ba->y;
     
      Fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        pAbout = gtk_message_dialog_new (GTK_WINDOW(Fenetre),
            GTK_DIALOG_MODAL,
            GTK_MESSAGE_INFO,
            GTK_BUTTONS_OK,
            "Clicked : %d-%d",
            i,j);
     
        gtk_dialog_run(GTK_DIALOG(pAbout));
        gtk_widget_destroy(pAbout);
     
    }
     
     
     
    int main(int argc,char **argv)
    {
     
     
        GtkWidget *window;
        GtkWidget *button[2][2];
        GtkWidget *tablo;
        GtkWidget *hbox;
     
        gint a,b;
     
        position ab;
     
        gtk_init(&argc,&argv);
     
     
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     
    hbox = gtk_hbox_new(TRUE, 0);
        gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(hbox));
     
        tablo = gtk_table_new(2,2,TRUE);
        gtk_container_add(GTK_CONTAINER(hbox), GTK_WIDGET(tablo));
     
        for(a=0;a<2;a++)
        for(b=0;b<2;b++)
        {
        button[a][b] = gtk_button_new();     	 
           ab.x=a;
           ab.y=b;
           g_signal_connect(G_OBJECT( button[a][b] ), "clicked", G_CALLBACK(fct), &ab );
     
           gtk_table_attach(GTK_TABLE(tablo),button[a][b], a , a+1,b , b+1,0,0,0, 0);  
     
        }
     
        g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(OnDestroy), NULL);
     
        gtk_widget_show_all(window);
     
     
        gtk_main();
     
        return EXIT_SUCCESS;
    }
    Merci d'avance!

    ---------- édit -----------

    [code rectifié]Il n'y a plus de problème lors de la compilation.

    Mais ça me renvoi toujours 1-1 (équivalent à la dernière modification de ab)
    Comment y remédier ?

  2. #2
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Ta fonction récupère un pointeur vers la structure et non pas une image de la structure au moment où elle a été enregistrée.

    Donc pour résoudre ton problème, une solution pourrait être de créer autant de structures que de fois que t'enregistre le callback.

    Par exemple :
    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
     
    position ab[4];
    position *pos = ab
    [...]
    for(a=0;a<2;a++)
      for(b=0;b<2;b++)
      {
        [...]
        pos->x=a;
        pos->y=b;
        [...]
        g_signal_connect(G_OBJECT( button[a][b] ), "clicked", G_CALLBACK(fct), &pos );
        [...]
        pos++;
        [...]
      }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Bonjour,

    Merci valefor !
    Ta méthode marche nickel mais il y a quelque chose d'embêtant ^^
    Avec ta méthode je dois réinitialisé toutes les autres variables à chaque passage dans la boucle.

    Ex:

    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
    typedef struct{
            int x;
            int y;
            
            int c;
            
            }position;
    
    [...]
    
        for(a=0;a<2;a++)
        for(b=0;b<2;b++)
        {
        button[a][b] = gtk_button_new();     	 
          pos->x=a;
          pos->y=b;
          pos->c=40;
           g_signal_connect(G_OBJECT( button[a][b] ), "clicked", G_CALLBACK(fct),pos );
          pos++;
    
    [...]
    
              
        }
    ------

    Encore merci.

  4. #4
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Effectivement, mon exemple était là pour t'aider à trouver le problème, mais il existe certainement des solutions plus élégantes.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 3
    Par défaut
    Très bien.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/06/2013, 14h26
  2. [Débutant] Pb avec les paramètres dans lien dynamique
    Par hackwell69 dans le forum Struts 1
    Réponses: 2
    Dernier message: 21/02/2005, 11h33
  3. Changer les paramètres régionaux
    Par STEF_1 dans le forum Access
    Réponses: 2
    Dernier message: 27/10/2004, 15h39
  4. Problème avec les paramètres date BDE/ODBC Oracle/XP Pro
    Par Bloon dans le forum Bases de données
    Réponses: 3
    Dernier message: 06/10/2004, 10h09
  5. Réponses: 4
    Dernier message: 04/07/2003, 19h13

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