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 :

scroll bar et impl�mentation dynamique dans une gtk_vbox


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut scroll bar et impl�mentation dynamique dans une gtk_vbox
    Bonjour � tous,

    J'ai un double probl�me avec le code suivant, qui concerne l'usage des gtk_scrolled_window et l'ajout dynamique d'�l�ments dans une gtk_box. Peut-�tre dois-je faire ici deux posts diff�rents (si tel est le cas, merci de me le dire, je modifierai ce post), mais il me semble que ces deux probl�mes sont li�s. Le code suivant est un code exemple qui montre de quoi il s'agit :

    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
    /* travail sur les scrolled barres et les implémentations dynamiques de v box */
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* vbox; /* v box princale */
    GtkWidget* vbox2;
    GtkAdjustment *verticalAdjust;
    GtkWidget* barre; /* scrolled windows */
     
    int main(int argc,char **argv)
    {
        GtkWidget* pWindow;
        GtkWidget* pLabel[20];
        GtkWidget* boutton;
        int i;
        char tempo[20];
     
        void suite(GtkWidget *widget, gpointer pData); /* fonction call back si boutton clicked */
     
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "scrolled barre et construction de vbox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        /* Creation des labels */
        for (i=0; i<20;i++)
        {
                pLabel[i]=gtk_label_new(NULL);
                (void)sprintf(tempo,"label %2d",i);
                gtk_label_set_text (pLabel[i], tempo);
        }
        /* on les mets dans une v box */
        vbox2=gtk_vbox_new(FALSE, 0);
        for (i=0; i<20;i++)
            gtk_box_pack_start(GTK_BOX(vbox2), pLabel[i], TRUE, TRUE, 0);
        /* creation d'une autre v box (principale) */
        vbox=gtk_vbox_new(FALSE, 0);
        /* creation du widget avec barre de défilement */
        barre=gtk_scrolled_window_new(NULL, NULL);
        /* on ne veux que la barre verticale - if needed */
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(barre), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        /* on ne veux pas de bord autour */
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(barre), GTK_SHADOW_NONE);
        /* on met la barre à droite */
        gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(barre), GTK_CORNER_BOTTOM_RIGHT);
        /* on déroule tout en bas */
        verticalAdjust=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(barre));
        gtk_adjustment_set_value(verticalAdjust, verticalAdjust->upper);
        gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(barre), verticalAdjust);
        /* creation d'un bouton et on le met dans la v box principale */
        boutton=gtk_button_new_with_label("ajout d'un label");
        gtk_box_pack_start(GTK_BOX(vbox), boutton, FALSE, FALSE, 0);
        /* on met la v box dans le widget avec barre de défilement*/
        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(barre), vbox2);
        /* On ajoute le widget avec barre de défilement a l'intérieur de la v box principale */
        gtk_box_pack_start(GTK_BOX(vbox), barre, TRUE, TRUE, 0);
        gtk_container_add(GTK_CONTAINER(pWindow), vbox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(boutton), "clicked", G_CALLBACK(suite), NULL);
        /* Affichage de la fenêtré et de tout ce qu'il contient */
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
    void suite(GtkWidget *window, gpointer data)
    {
        GtkWidget* label=NULL;
        label=gtk_label_new("un autre label");
        /* on rajoute un élément à la v box */
        gtk_box_pack_start(GTK_BOX(vbox2),label, TRUE, TRUE, 0);
        /* et on déroule tout en bas */
        verticalAdjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(barre));
        gtk_adjustment_set_value(verticalAdjust, verticalAdjust->upper);
        gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(barre), verticalAdjust);
    }
    Cliquer sur le bouton, comme vous pouvez le voir, a deux missions :

    1) Rajouter un label � la box verticale, et
    2) scrolling tout en bas la scroll barre.

    Les deux questions que j'ai sont les suivantes :

    1) Les lignes de code 46 � 49 doivent faire un scrolling tout en bas par d�faut (avant tout click sur le bouton) de la scroll barre. Ca ne fonctionne pas. Seul un(des) click(s) sur le bouton (i.e., le code de la fonction callback) le fait correctement. Pourquoi ? C'est exactement le m�me code qu'il y a aux deux endroits !

    2) L'ajout d'un label � la box verticale (fait dans la fonction callback) ne fonctionne pas. Pourquoi ? Ne peut-on pas ajouter quelque chose � un gtk_box une fois qu'elle est ins�r�e dans un widget ? Si oui, comment fait alors ? Doit-on tout "d�monter", ajouter, et tout "remonter" ? Ca me parait bien lourd.

    Merci d'avance pour toute aide sur ces deux points.

    Cordialement, Eric.

  2. #2
    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
    Pour ce qui est de rajouter le label, il manque simplement un gtk_widget_show(label); dans la fonction suite pour r�aliser le label rajout�.

    aussi ligne 30: rajouter GTK_LABEL()
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gtk_label_set_text (GTK_LABEL(pLabel[i]), tempo);

  3. #3
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut
    Citation Envoy� par pvincent Voir le message
    Pour ce qui est de rajouter le label, il manque simplement un gtk_widget_show(label); dans la fonction suite pour r�aliser le label rajout�.

    aussi ligne 30: rajouter GTK_LABEL()
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gtk_label_set_text (GTK_LABEL(pLabel[i]), tempo);
    Ok, merci beaucoup! Ceci r�pond effectivement � ma seconde question.

    Reste � r�soudre l'�nigme (pour moi) de la premi�re. Pourquoi les lignes 46 � 49 de mon code, qui ont pour objet de faire un scrolling tout en bas par d�faut de la slide barre, ne fonctionnent pas ?

    Cordialement,

    Eric.

  4. #4
    Membre confirm�
    Homme Profil pro
    D�veloppeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par d�faut
    salut,

    Pour que tu puisses modifier les Adjustment de la scrollbar, il faut que le widget scrolled window soit dessin�.
    Place un gtk_widget_show(barre) (ou show_all(pwindow) ) avant de modifier l'adjustment.

  5. #5
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut
    Citation Envoy� par rollbich Voir le message
    salut,

    Pour que tu puisses modifier les Adjustment de la scrollbar, il faut que le widget scrolled window soit dessin�.
    Place un gtk_widget_show(barre) (ou show_all(pwindow) ) avant de modifier l'adjustment.
    Merci,

    Je viens de faire plusieurs essais. Ca ne fonctionne pas. Un gtk_widget_show(barre) avant ne change rien. Et d�rouler la scroll bar tout en bas apr�s le gtk_widget_show_all(pWindow) ne fonctionne pas non plus.

    J'ai loup� quelque chose ?

    Encore merci pour toute aide sur ce point!

    Eric.

  6. #6
    Membre confirm�
    Homme Profil pro
    D�veloppeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par d�faut
    salut,

    J'ai compil� ton code (j'ai d� enlever verticalAdjust->upper et le remplacer par une valeur car je suis sous gtk3 et �a doit plus exister)

    Le code suivant fonctionne chez moi :

    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
    /* travail sur les scrolled barres et les implémentations dynamiques de v box */
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* vbox; /* v box princale */
    GtkWidget* vbox2;
    GtkAdjustment *verticalAdjust;
    GtkWidget* barre; /* scrolled windows */
     
    int main(int argc,char **argv)
    {
        GtkWidget* pWindow;
        GtkWidget* pLabel[20];
        GtkWidget* boutton;
        int i;
        char tempo[20];
     
        void suite(GtkWidget *widget, gpointer pData); /* fonction call back si boutton clicked */
     
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "scrolled barre et construction de vbox");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        /* Creation des labels */
        for (i=0; i<20;i++)
        {
                pLabel[i]=gtk_label_new(NULL);
                (void)sprintf(tempo,"label %2d",i);
                gtk_label_set_text (pLabel[i], tempo);
        }
     
        vbox2=gtk_vbox_new(FALSE, 0);
        for (i=0; i<20;i++)
            gtk_box_pack_start(GTK_BOX(vbox2), pLabel[i], TRUE, TRUE, 0);
     
        vbox=gtk_vbox_new(FALSE, 0);
     
        barre=gtk_scrolled_window_new(NULL, NULL);
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(barre), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(barre), GTK_SHADOW_NONE);
     
        boutton=gtk_button_new_with_label("ajout d'un label");
        gtk_box_pack_start(GTK_BOX(vbox), boutton, FALSE, FALSE, 0);
        /* on met la v box dans le widget avec barre de défilement*/
        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(barre), vbox2);
        /* On ajoute le widget avec barre de défilement a l'intérieur de la v box principale */
        gtk_box_pack_start(GTK_BOX(vbox), barre, TRUE, TRUE, 0);
        gtk_container_add(GTK_CONTAINER(pWindow), vbox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        /* Affichage de la fenêtré et de tout ce qu'il contient */
        gtk_widget_show_all(pWindow);
        verticalAdjust=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(barre));
        gtk_adjustment_set_value(verticalAdjust, 120);
        gtk_main();
        return EXIT_SUCCESS;
    }
    Comme je te l'avais indiqu�, si tu places le gtk_adjustment_set_value avant le gtk_widget_show_all, �a marche pas

  7. #7
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut
    Citation Envoy� par rollbich Voir le message
    salut,

    J'ai compil� ton code (j'ai d� enlever verticalAdjust->upper et le remplacer par une valeur car je suis sous gtk3 et �a doit plus exister)

    Le code suivant fonctionne chez moi :

    Comme je te l'avais indiqu�, si tu places le gtk_adjustment_set_value avant le gtk_widget_show_all, �a marche pas
    Bon, on avance, merci. Mais je ne comprends toujours pas. Deux choses restent � r�soudre :

    1) Votre code marche alors que vous avez vir� la ligne:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(barre), verticalAdjust);
    Pourtant - dans ma compr�hension - c'est cette instruction qui devrait justement rendre effective la modification de valeur de la struct GtkAdjustment. Une explication ?

    2) Effectivement, votre code fonctionne si on remplace verticalAdjust->upper par une constante, et vous dites que vous faites ca car vous �tes sous gtk3. Mais, c'est bien sous gtk3 que "upper" est d�fini dans la documentation officielle comme un �l�ment de la struct GtkAdjustment (GtkAdjustment). Si je remets "verticalAdjust->upper" dans votre code, ca plante. Or ca marche s'il est dans une fonction callback (comme dans mon code initial). Il r�side bien une �nigme � r�soudre ici.

    Encore merci pour toute aide sur ce point!

    Eric.

  8. #8
    Membre confirm�
    Homme Profil pro
    D�veloppeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par d�faut
    Chez moi, j'ai une erreur � la compilation pour verticalAdjust->upper.
    Ce qui semble tout � fait normal car on peut lire dans la doc gtk3 :
    struct GtkAdjustment;
    The GtkAdjustment struct contains only private fields and should not be directly accessed.
    Les champs sont priv�s, par cons�quent non accessibles.

    Je ne comprends pas pourquoi tu n'as pas d'erreur � la compil et pourquoi �a semble marcher dans la callback (j'ai pas test�)

    Si tu n'as besoin de changer que la position de la scrollbar, utilise :
    qui est l� pour �a.

    Utilise
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gtk_scrolled_window_set_vadjustment
    si tu souhaites modifier tous les param�tres de la scrollbar.

  9. #9
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut
    Citation Envoy� par rollbich Voir le message
    Si tu n'as besoin de changer que la position de la scrollbar, utilise :
    qui est l� pour �a.
    Ok merci. Les choses s'�claircissent encore un peu plus. Reste donc juste � r�soudre un dernier point :

    Comme r�cup�rer la valeur � envoyer a gtk_adjustment_set_value pour mettre la position de la scrollbar tout en bas ? C'�tait l'id�e de upper (et ca semblait marcher, m�me si je comprends votre r�ponse). Mettre une constante ne marche pas tout le temps, par exemple si la fen�tre est redimensionn�e par l'utilisateur. Il faut bien argumenter ce que retourne gtk_scrolled_window_get_vadjustment. Mais comment ?

    Encore merci pour toute aide sur ce point !

    Eric.

  10. #10
    Membre confirm�
    Homme Profil pro
    D�veloppeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par d�faut
    bonsoir,

    Lorsque des champs sont priv�s, il y a g�n�ralement des fonctions fournies par le programme pour y acc�der en lecture/�criture. (get/set)

    https://developer.gnome.org/gtk3/sta...djustment.html

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    gdouble upper = gtk_adjustment_get_upper (verticalAdjust);
    Ca devrait r�soudre ton probl�me.

  11. #11
    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
    Je lis dans la description de GtkScrolledWindow
    the "value" field represents the position of the scrollbar, which must be between the "lower" field and "upper - page_size." The "page_size" field represents the size of the visible scrollable area.
    Donc il faut non seulement mettre le positionnement apr�s le gtk_widget_show_all(pWindow);
    mais �crire
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     gtk_adjustment_set_value (verticalAdjust, verticalAdjust->upper - verticalAdjust->page_size);
    Remarque: dans GTK2 la structure des GtkAdjustment n'est pas priv�e et en imprimant les valeurs impliqu�es, on comprend mieux ce qui se passe.

    Par contre, dans suite(), si tu retranche le page_size, le dernier label ajout� n'est pas rendu visible, peut �tre � cause de l'ordre dans lequel sont effectu�s le callback et la n�gociation de la taille pour la scrolled window car si on appuie plusieurs fois sur le bouton, l'avant dernier label rajout� appara�t.
    Chez moi, en ne mettant pas le page_size dans suite(), �a marche comme esp�r�, mais ce n'est pas tr�s orthodoxe.

  12. #12
    Membre confirm�
    Homme Profil pro
    chercheur
    Inscrit en
    D�cembre 2012
    Messages
    195
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : chercheur

    Informations forums :
    Inscription : D�cembre 2012
    Messages : 195
    Par d�faut
    Ok, effectivement, il faut rajouter "- verticalAdjust->page_size". Ca m'etonnait en fait que l'on ne puisse pas r�cup�rer les �l�ments de la struct GtkAdjustment.

    Et effectivement, il ne faut pas argumenter verticalAdjust->page_size dans la fonction callback. Et - m�me si ca marche � pr�sent effectivement - ca reste tout de m�me tr�s myst�rieux..

    Merci en tout cas pour l'aide.

    Cordialement,

    Eric.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 0
    Dernier message: 15/09/2014, 12h12
  2. SQL dynamique dans une proc�dure stock�e
    Par Amnesiak dans le forum MS SQL Server
    R�ponses: 2
    Dernier message: 15/07/2005, 15h17
  3. variable dynamique dans une fonction javascript
    Par Shivaneth dans le forum G�n�ral JavaScript
    R�ponses: 2
    Dernier message: 20/04/2005, 15h58
  4. [jsp] include dynamique dans une jsp
    Par petitelulu dans le forum Servlets/JSP
    R�ponses: 9
    Dernier message: 04/03/2005, 07h59
  5. R�ponses: 6
    Dernier message: 24/09/2004, 13h10

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