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+ Discussion :

Comment actualiser le contenu d'une fenêtre mère


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comment actualiser le contenu d'une fenêtre mère
    Bonsoir tout le monde,

    Je viens vous poser une question dans l'espoir de trouver une réponse, car je ne comprends pas du tout les tutoriels concernant cette partie de GTK .

    Mon problème est le suivant, j'ai réussi à faire une interface graphique sous forme d'un calendrier. Chaque jour est associé à un bouton, et à une image paint que j'ai créé. Je click sur un jour, puis là s'ouvre une fenêtre avec 7 boutons ( ajouter modifier supprimer RDV et MEMO , et afficher et confirmer les RDV). Derrière ça j'ai réussi à associer au bouton RDV par exemple la création d'un fichier texte à partir des informations que je saisis.

    Sauf que pour qu'on sache si il y a un rendez vous, dans mon main, je choisis soit des images bleues si il y a un RDV, soit verte si il y a un mémo ,soit verte et bleue si il y a les deux, et blanche sinon.

    Tout ce dont je viens de parler jusqu'à maintenant fonctionne. Mais le hic arrive: pour voir l'affichage des RDV il faut que je relance le programme pour que dans le main, je réassocie les images après avoir cherché si les fichiers txt existaient.

    Ma question est donc, comment puis-je faire un rafraichissement automatique ? J'avais pensé à passer en paramètre la fenêtre mère, mais j'ai deux fenêtre filles , donc je ne sais pas comment faire, et puis même si je le faisais à la première fenêtre, je ne saurais pas non plus comment faire puisque je ne comprends pas comment fonctionne le dernier paramètre de G signal connect.

    Les choses que je dois pouvoir refaire tourner pour régénérer l'affichage sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void associeBoutonImage(int jour,int dernierJour,GtkWidget *pImage[28]);
    void insertImageBouton(GtkWidget *pButton[28],GtkWidget *pImage[28]);

    J'espère avoir été assez clair, merci d'avance !

    Bobi.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 313
    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 313
    Billets dans le blog
    5
    Par défaut
    La réponse est relativement simple. Encore faut-il le savoir.

    Si tu veux effectuer une tâche régulièrement et automatiquement il faut que cette tâche fasse partie de la boucle principale de Gtk+. Pour se faire il existe quatre fonctions, selon tes besoin, dont :

    Grâce à elles tu indiques une fonction CallBack qui sera exécutée selon la période que tu auras choisi. Cette période n'est pas garantie. Mais pour tes besoins ça fonctionnera très bien.
    Dans ta fonction CallBack tu pourras tester si un RDV existe et mettre ainsi à jour la couleur du bouton correspondant.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    La réponse est relativement simple. Encore faut-il le savoir.

    Si tu veux effectuer une tâche régulièrement et automatiquement il faut que cette tâche fasse partie de la boucle principale de Gtk+. Pour se faire il existe quatre fonctions, selon tes besoin, dont :

    Grâce à elles tu indiques une fonction CallBack qui sera exécutée selon la période que tu auras choisi. Cette période n'est pas garantie. Mais pour tes besoins ça fonctionnera très bien.
    Dans ta fonction CallBack tu pourras tester si un RDV existe et mettre ainsi à jour la couleur du bouton correspondant.

    Tout d'abord, merci beaucoup pour votre réponse ! Je pense que cette fonction est idéale, mais après avoir essayé de la mettre en route, j'ai des messages d'erreurs que je ne comprends pas .

    J'ai mis dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add_seconds(4,associeBoutonImage(jour,mois.Dernier_jour,mere->pImage),mere->pImage);
    associeBoutonImage est la fonction que j'ai cité précédemment, jour représente le numéro du jour d'aujourd'hui, le second paramètre comme son nom l'indique, le dernier jour du mois, et mere représente la structure de ma fenêtre mère, avec mere->pImage qui représente le tableau de 28 images que j'associe à mes 28 boutons .

    Les erreurs que j'ai obtenu sont :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	1	error C2095: 'g_timeout_add_seconds'*: le paramètre réel a 'void' comme type*: paramètre 2	c:\users\j.maurice\desktop\projet algo\projet gtk+\projet gtk+\main.c	184	projet gtk+
    Erreur	4	error C2198: 'g_timeout_add_seconds'*: pas assez d'arguments pour un appel	c:\users\j.maurice\desktop\projet algo\projet gtk+\projet gtk+\main.c	184	projet gtk+
    J'ai essayé de changer en mettant juste le nom de la fonction sans les paramètres, mais vu que j'ai besoin d'y mettre la structure mere->pImage, je vois pas comment elle les modifierais sans les arguments .

    En tout cas merci beaucoup !

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 313
    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 313
    Billets dans le blog
    5
    Par défaut
    Ces fonctions demandent de transmettre un pointeur sur une fonction avec un prototype particulier. Ce prototype est un GSourceFunc ().
    En partant de là tu ne peux transmettre à ce type de fonctions qu'un pointeur comme données utilisateur. Cette donnée utilisateur correspond au dernier argument des fonctions d'appel citées dans mon premier post.
    A partir de là tu te rends compte qu'il va falloir que tu organises tes données autrement si tu veux pouvoir les transmettre. Le meilleur moyen est de les regrouper dans une structure. Il ne te reste alors qu'à transmettre un pointeur sur une variable du type de ta structure pour récupérer tout ce petit monde.

    Voila un exemple rapide pour t'aider à saisir le principe:
    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
     
    typedef struct
    {
      int jour;
      int mois;
      GdkPixbuf *image;
    } SGlobalData;
     
    gboolean callback_func (gpointer user_data)
    {
      /* On récupère en transtypant la variable transmise */
      SGlobalData * = (SGlobalData*) user_data;
     
     /* A partir d'ici on fait le traitement que l'on veut. */
     
      return FALSE;
    }
     
    int main (int argc, char *argv[])
    {
      SGlobalData data;
     
      /* Je n'écris pas ici tout le code pour créer et exécuter une fenêtre Gtk+. */
      /* Ce n'est pas le but de l'exemple. */
      /* Je n'écris que la connexion du callback exécuté toutes les secondes */
      /* pour comprendre comment on connecte tout ce petit monde. */
      g_timeout_add_seconds(1, (GSourceFunc)callback_func, &data);
      return 0;
    }
    Voila, en espérant être clair...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour votre réponse, j'ai essayé , et voila ce que ça m'a donné:

    J'ai mis dans mon int main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);
    J'ai mis dans le fichier main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    gboolean rafraichissement (gpointer user_data)
    {
     
    	int jour=date();
    	Mois mois;
      Mere* mere= user_data;
     
      init_mois(&mois);
      associeBoutonImage(jour,mois.Dernier_jour,mere->pImage);
     
     
     
      return FALSE;
    }
    Dans mon fichier.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gboolean rafraichissement (gpointer user_data);
    Et voila les erreurs qu'il me met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur	121	error LNK2001: symbole externe non résolu _g_timeout_add_seconds	main.obj	projet gtk+
    Erreur	122	fatal error LNK1120: 1 externes non résolus	C:\Users\J.MAURICE\Desktop\projet algo\projet gtk+\Debug\projet gtk+.exe	projet gtk+
    Si je commente le code que j'ai rajouté, cela fonctionne, donc je ne sais pas ce qui pose problème dans ce que j'ai rajouté

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 313
    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 313
    Billets dans le blog
    5
    Par défaut
    Je suppose que Mere est un pointeur sur une structure. Lors du stranstypage il faut donner explicitement le format de la donnée reçue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mere* mere= (Mere*)user_data;
    Dans la fonction suivante j'espère que mere est un pointeur, et pas une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add_seconds(4,(GSourceFunc)rafraichissement,mere);

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/05/2011, 10h36
  2. Comment copier le contenu d'une fenêtre dos
    Par Tragan dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 24/12/2009, 16h13
  3. Réponses: 8
    Dernier message: 16/08/2008, 21h38
  4. [C#] Imprimer le contenu d'une fenêtre avec ascenseur
    Par biglong dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/08/2007, 23h29
  5. Comment effacer le contenu d'une scrollbox???
    Par Leclair2000 dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2004, 16h34

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