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 :

Gestion des fenetres sur GTK


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut Gestion des fenetres sur GTK
    Bonjour ou Bonsoir si jamais il fait nuit chez vous :-p,
    Donc tout simplement je debute avec la libraire GTK+ et donc je suis en train de crée un petit logiciel pour mon entreprise...

    Donc en faite je crée une premiere fenetre avec plusieur bouton dedans.
    Sur un bouton j'ai fait un callback qui ouvre une autre fenetre.
    Dans cette fenettre j'avait fait un appel vers un callback pour quand je clique sur la croix de la nouvelle fenetre qui executait "gtk_main_quit()"...
    Seulement je me suis vite rendu compte qu'il fermer toute l'application en generale...
    J'ai chercher et j'ai vu sur certain forum que certain parlait de delent-event ou autre, j'ai ete voir dans la doc, mais j'ai pas saisi le fonctionnement de tous sa.

    Quelqu'un pourrait-il m'expliquer comment je pourrais supprimer la seconde fenetre qui souvre sans pour autant terminé l'application?

    Merci,

  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
    gtk_main_quit(); arrête la boucle principale de GTK+. Donc tout l'affichage disparait. Connecte plutôt gtk_widget_destroy();. Seulement alors le widget concerné par le signal "delete-event" sera détruit.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Par défaut
    Merci,
    Mais je n'arrive pas à compiler...
    Peut tu me montrer comment tu utiliserai la commande?
    car il n'en veut pas...

    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
     
    void cb_Destroy_Widget()
    {
    gtk_widget_destroy(GTK_WINDOW(pEncodageWindow));
    }
     
    void cb_Encodage()
    {
        GtkWidget *pEncodageWindow = NULL;
     
        pEncodageWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pEncodageWindow), "Encodage GSM");
        gtk_window_set_position(GTK_WINDOW(pEncodageWindow), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(pEncodageWindow), 500, 400);
        gtk_container_set_border_width(GTK_CONTAINER(pEncodageWindow), 10);
     
        gtk_widget_show_all(pEncodageWindow);
     
        g_signal_connect(G_OBJECT(pEncodageWindow), "destroy", G_CALLBACK(cb_Destroy_Widget), NULL);
    }

  4. #4
    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
    Le signal "destroy" n'existe pas. Au mieux c'est "destroy-event" mais il vaut mieux utiliser "delete-event".
    Ensuite pour chaque signal est attaché un format particulier de fonction CALLBACK. Pour le signal "delete-event" ce format est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    The "delete-event" signal
     
    gboolean            user_function                      (GtkWidget *widget,
                                                            GdkEvent  *event,
                                                            gpointer   user_data)
    Donc ta fonction void cb_Destroy_Widget(); doit devenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean cb_Destroy_Widget(GtkWidget *widget, GdkEvent *event, gpointer user_data);
    Elle pourra ici retourner la valeur TRUE.
    Comme tu peux le voir le prototype de la fonction commence avec une variable de type GtkWidget*. Ce pointeur est la fenêtre qui a reçu le signal. Ici pEncodageWindow.
    Tu peux donc dans ton CALLBACK l'utiliser directement. Comme actuellement tu déclares pEncodageWindow dans la fonction void cb_Encodage(); il n'existe qu'ici. Le fait de vouloir l'utiliser dans le CALLBACK génère une erreur de compilation.

    Pour finir voila ton code remanié :
    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
    gboolean cb_Destroy_Widget(GtkWidget *widget, GdkEvent *event, gpointer user_data)
    {
    gtk_widget_destroy(GTK_WINDOW(widget));
     
    return TRUE;
    }
     
    void cb_Encodage()
    {
        GtkWidget *pEncodageWindow = NULL;
     
        pEncodageWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pEncodageWindow), "Encodage GSM");
        gtk_window_set_position(GTK_WINDOW(pEncodageWindow), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(pEncodageWindow), 500, 400);
        gtk_container_set_border_width(GTK_CONTAINER(pEncodageWindow), 10);
     
        gtk_widget_show_all(pEncodageWindow);
     
        g_signal_connect(G_OBJECT(pEncodageWindow), "delete-event", G_CALLBACK(cb_Destroy_Widget), NULL);
    }

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Le signal "destroy" n'existe pas.
    sisi : GtkObject::destroy

    Citation Envoyé par gerald3d Voir le message
    il vaut mieux utiliser "delete-event".
    ça début pour quoi faire :

    • Si c'est juste pour détruire la seconde fenêtre, le comportement pas défaut est suffisant (pas besoin d'intercepter un signal),
    • Si tu as alloué de la mémoire dynamiquement, tu dois la libérer en interceptant le signal destroy,
    • Si tu souhaite empêcher la fenêtre de se fermer (par exemple pour demander confirmation à l'utilisateur), il intercepter le signal delete-event.

  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
    Au temps pour moi pour le signal "destroy". J'ai répondu un peu vite

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

Discussions similaires

  1. [2D] Gestion des sprites sur un moteur 2d
    Par drcd dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 27/03/2006, 16h17
  2. [MDI] gestion des fenêtres
    Par Lenaick dans le forum C++Builder
    Réponses: 12
    Dernier message: 23/02/2006, 18h15
  3. Réponses: 4
    Dernier message: 25/11/2005, 18h15
  4. Application de gestion des sms sur PC
    Par andyvo dans le forum Langage
    Réponses: 9
    Dernier message: 20/10/2005, 23h49
  5. Question sur la gestion des fenetres MDI
    Par RémiONERA dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/07/2005, 07h58

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