| 12
 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);
} | 
Partager