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 :

comment récupere un paramètre dans une fonction call


Sujet :

GTK+ avec C & C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut comment récupere un paramètre dans une fonction call
    Bonjour,

    j'ai parcourue tous les sites que je connais mais je n'ai pas trouvé la solution à mon problème ou plutot je n'ai pas su appliquer à mon problème ce que j'ai pu apprendre et cela me rend terriblement triste de devoir demander la réponse mais je n'ai plus le choix. Voila mon exercice:

    * Ecrivez un programme qui ouvre une deuxième fenêtre quand on clique sur la croix de la première.
    * Quitter le programme quand on clique sur la croix de la deuxième.
    * La deuxième fenêtre contiendra le titre de la première dans un label.

    Ce que je n'arrive pas à faire c'est le troisieme point. Pouvez vous m'aider svp?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Pour connecter un CALLBACK à un signal on utilise généralement la fonction g_signal_connect(); ( il existe des variantes mais ce n'est pas le sujet). La dernière variable de cette fonction est un pointeur générique gpointer.
    Dans le CALLBACK on retrouve en dernier paramètre un pointeur générique gpointer également. En réalité g_signal_connect(); transmet le dernier pointeur à la fonction CALLBACK. Ainsi tu peux trasnmettre n'importe qu'elle information par ce biais.

    Maintenant vu ton exercice il y a plus simple encore. Le CALLBACK appelé est attaché à ta fenêtre. Donc tu as en premier paramêtre de celui-ci le pointeur de ta fenêtre. Il te suffit alors d'utiliser la fonction gtk_window_get_title(); pour récupérer son nom. Une fois fait tu crées ta deuxieme fenêtre et tu détruis la première.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Un grand MERCI!!!
    le programme fonctionne bien maintenant. Si non, si ca ne vous dérange pas trop, j'aimerais que vous analysez mon programme initiale et que vous me disiez pourquoi je n'arrive pas à récupérer mon parametre.

    Merci encore:
    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
     
    void mafonction(GtkWidget *widget, gpointer data);
    void deuxiemefenetre(GtkWidget *widget, gpointer data);
     
     
    int main(int argc, char **argv)
    {
        GtkWidget * MainWindow = NULL;
        const gchar *titre = NULL;
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
     
        /* Création de la fenêtre */
        MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);   
        gtk_window_set_title(GTK_WINDOW(MainWindow), "\tpremiere fenetre\t");
        titre = gtk_window_get_title(GTK_WINDOW(MainWindow));
        g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( deuxiemefenetre ), &titre);	
     
        /* Affichage et boucle événementielle */
        gtk_widget_show_all(MainWindow);
        gtk_main();
     
        /* Fermeture de GTK+ */
        gtk_exit(EXIT_SUCCESS);
        return EXIT_SUCCESS;
    }
     
    void deuxiemefenetre(GtkWidget *widget, gpointer data)
    {
    	GtkWidget *fenetre = NULL, *label = NULL;
    	const gchar *text;
     
    	//text = gtk_window_get_title(GTK_WINDOW(widget));
    	//gtk_widget_destroy(widget);
     
    	fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);	
    	gtk_window_resize(GTK_WINDOW(fenetre), 800, 200);
     
    	label = gtk_label_new(data);	
    	gtk_container_add(GTK_CONTAINER(fenetre), label);
     
    	g_signal_connect(G_OBJECT(fenetre), "delete-event", G_CALLBACK(mafonction), NULL);
     
    	gtk_widget_show_all(fenetre);
    	gtk_main();
     
    }
     
    void mafonction(GtkWidget *widget, gpointer data)
    {
    	gtk_main_quit();
         printf("\n\tc'est la fin\n");
    }

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 296
    Points : 4 949
    Points
    4 949
    Billets dans le blog
    5
    Par défaut
    Deux problèmes :
    1. Lorsque tu envoies ton paramètre tu écris &titre. Cette notation indique que tu envoies l'adresse du pointeur et non le pointeur.Ecris plutôt g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( deuxiemefenetre ), titre);
    2. Dans la fonction CALLBACK il faut transtyper le gpointer data. Par exemple en écrivant label = gtk_label_new((gchar*)data);

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    j'ai essayé cette technique mais ça ne marche toujours pas

  6. #6
    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
    Citation Envoyé par gerald3d Voir le message
    Dans la fonction CALLBACK il faut transtyper le gpointer data. Par exemple en écrivant label = gtk_label_new((gchar*)data);
    Cela n'a aucune importance. Un gpointer c'est void *, et un void * se caste implicitement en n'importe quel type. Pas besoin de cast explicite.

  7. #7
    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
    Alors, ton erreur était d'appeler 2 fois gtk_main. Cette fonction ne s'appelle qu'une fois, pour lancer la gestion des évènements gtk.

    Ensuite j'ai renommé un peu les fonctions pour que leur nom donne une indication sur ce qui les déclenche. C'est un peu plus parlant.

    Et enfin, j'ai transféré la récupération du titre dans la callback. Ainsi, tu pourrais changer en cours de route le titre de la fenêtre principale, en créant une nouvelle fenêtre celle ci aurait le nouveau titre et pas l'ancien.

    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
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
     
     
    void on_main_window_delete_event (GtkWidget *widget, gpointer data);
    void on_secondary_window_destroy (GtkWidget *widget, gpointer data);
     
     
    int main(int argc, char **argv)
    {
        GtkWidget * MainWindow = NULL;
     
        /* Initialisation de GTK+ */
        gtk_init(&argc, &argv);
     
        /* Création de la fenêtre */
        MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);   
        gtk_window_set_title(GTK_WINDOW(MainWindow), "\tpremiere fenetre\t");
        g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(on_main_window_delete_event), NULL);	
     
        /* Affichage et boucle événementielle */
        gtk_widget_show_all(MainWindow);
        gtk_main();
     
        /* Fermeture de GTK+ */
        return 0;
    }
     
    void on_main_window_delete_event (GtkWidget *widget, gpointer data)
    {
    	GtkWidget *fenetre = NULL, *label = NULL;
    	const gchar *titre;
     
    	fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);	
    	gtk_window_resize(GTK_WINDOW(fenetre), 800, 200);
    	titre = gtk_window_get_title(GTK_WINDOW (widget));
    	label = gtk_label_new(titre);
    	gtk_container_add(GTK_CONTAINER(fenetre), label);
     
    	g_signal_connect(G_OBJECT(fenetre), "destroy", G_CALLBACK(on_secondary_window_destroy), NULL);
     
    	gtk_widget_show_all(fenetre);
    }
     
    void on_secondary_window_destroy (GtkWidget *widget, gpointer data)
    {
    	gtk_main_quit();
    	printf("\n\tc'est la fin\n");
    }
    Voilà aussi un "diff" des deux versions:
    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
    [luis@donald test1]$ diff -up test.c.original  test.c
    --- test.c.original	2010-08-27 02:29:29.000000000 +0200
    +++ test.c	2010-08-27 02:39:47.000000000 +0200
    @@ -3,14 +3,13 @@
     #include <gtk/gtk.h>
     
     
    -void mafonction(GtkWidget *widget, gpointer data);
    -void deuxiemefenetre(GtkWidget *widget, gpointer data);
    +void on_main_window_delete_event (GtkWidget *widget, gpointer data);
    +void on_secondary_window_destroy (GtkWidget *widget, gpointer data);
     
     
     int main(int argc, char **argv)
     {
         GtkWidget * MainWindow = NULL;
    -    const gchar *titre = NULL;
     
         /* Initialisation de GTK+ */
         gtk_init(&argc, &argv);
    @@ -18,42 +17,35 @@ int main(int argc, char **argv)
         /* Création de la fenêtre */
         MainWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);   
         gtk_window_set_title(GTK_WINDOW(MainWindow), "\tpremiere fenetre\t");
    -    titre = gtk_window_get_title(GTK_WINDOW(MainWindow));
    -    g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK( deuxiemefenetre ), &titre);	
    +    g_signal_connect(G_OBJECT(MainWindow), "delete-event", G_CALLBACK(on_main_window_delete_event), NULL);	
     
         /* Affichage et boucle événementielle */
         gtk_widget_show_all(MainWindow);
         gtk_main();
     
         /* Fermeture de GTK+ */
    -    gtk_exit(EXIT_SUCCESS);
    -    return EXIT_SUCCESS;
    +    return 0;
     }
     
    -void deuxiemefenetre(GtkWidget *widget, gpointer data)
    +void on_main_window_delete_event (GtkWidget *widget, gpointer data)
     {
     	GtkWidget *fenetre = NULL, *label = NULL;
    -	const gchar *text;
    -	
    -	//text = gtk_window_get_title(GTK_WINDOW(widget));
    -	//gtk_widget_destroy(widget);
    +	const gchar *titre;
     
     	fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);	
     	gtk_window_resize(GTK_WINDOW(fenetre), 800, 200);
    -	
    -	label = gtk_label_new(data);	
    +	titre = gtk_window_get_title(GTK_WINDOW (widget));
    +	label = gtk_label_new(titre);
     	gtk_container_add(GTK_CONTAINER(fenetre), label);
     
    -	g_signal_connect(G_OBJECT(fenetre), "delete-event", G_CALLBACK(mafonction), NULL);
    +	g_signal_connect(G_OBJECT(fenetre), "destroy", G_CALLBACK(on_secondary_window_destroy), NULL);
     
     	gtk_widget_show_all(fenetre);
    -	gtk_main();
    -		
     }
     
    -void mafonction(GtkWidget *widget, gpointer data)
    +void on_secondary_window_destroy (GtkWidget *widget, gpointer data)
     {
     	gtk_main_quit();
    -     printf("\n\tc'est la fin\n");
    +	printf("\n\tc'est la fin\n");
     }

Discussions similaires

  1. [Langage][Classe][Methode]Comment récuperer les arguments d'une fonction ?
    Par FremyCompany dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/07/2006, 16h06
  2. Réponses: 6
    Dernier message: 24/07/2006, 15h22
  3. Réponses: 3
    Dernier message: 20/03/2006, 17h46
  4. [PL/SQL] Multi paramètre dans une fonction
    Par wiLL_ dans le forum Oracle
    Réponses: 2
    Dernier message: 28/02/2006, 17h31
  5. Réponses: 9
    Dernier message: 13/05/2005, 03h13

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