Programmation GTK/Fenêtres avec barres de défilement


Les fenêtres avec barres de défilement servent à créer des zones défilantes à l'intérieur d'une vraie fenêtre. On peut insérer n'importe quel widget dans ces fenêtres, ils seront accessibles quelle que soit leur taille en utilisant les barres de défilement.

La fonction suivante sert à créer une fenêtre avec barre de défilement :

 GtkWidget* gtk_scrolled_window_new (GtkAdjustment *hadjustment,
                                     GtkAdjustment *vadjustment);

Le premier paramètre est l'ajustement horizontal, et le second l'ajustement vertical. Ils sont presque toujours positionnés à NULL.

 void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
                                      GtkPolicyType      hscrollbar_policy,
                                      GtkPolicyType      vscrollbar_policy);

Cela permet de configurer le fonctionnement des barres de défilement. Le premier paramètre est la fenêtre à défilement que l'on veut modifier, le second configure le fonctionnement de la barre horizontale et le troisième celui de la barre verticale.

Ce fonctionnement peut être GTK_POLICY AUTOMATIC ou GTK_POLICY_ALWAYS. GTK_POLICY_AUTOMATIC décidera automatiquement de votre besoin en barres de défilement, alors que GTK_POLICY_ALWAYS mettra toujours celles-ci.

Voici un exemple simple qui place 100 boutons commutateurs dans une fenêtre à défilement. Je n'ai commenté que les parties qui sont nouvelles pour vous.

 #include <gtk/gtk.h>
 
 void destroy(GtkWidget *widget, gpointer *data)
 {
    gtk_main_quit();
 }
 
 int main (int argc, char *argv[])
 {
    static GtkWidget *window;
    GtkWidget *scrolled_window;
    GtkWidget *table;
    GtkWidget *button;
    char buffer[32];
    int i, j;
    
    gtk_init (&argc, &argv);
    
    /* Création d'une boîte de dialogue pour y placer la fenêtre à défilement.
     * Une boîte de dialogue est une fenêtre comme les autres sauf qu'elle contient
     * une vbox et un séparateur horizontal. Ce n'est qu'un raccourci pour créer des
     * zones de dialogue. */
 
    window = gtk_dialog_new ();
    gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        (GtkSignalFunc) destroy, NULL);
    gtk_window_set_title (GTK_WINDOW (window), "dialog");
    gtk_container_border_width (GTK_CONTAINER (window), 0);
    
    /* Création d'une fenêtre à défilement. */
 
    scrolled_window = gtk_scrolled_window_new (NULL, NULL);
    
    gtk_container_border_width (GTK_CONTAINER (scrolled_window), 10);
    
    /* La gestion des barres est soit GTK_POLICY AUTOMATIC, soit  GTK_POLICY_ALWAYS.
     * GTK_POLICY_AUTOMATIC décide automatiquement s'il faut ou non des barres,
     * GTK_POLICY_ALWAYS met toujours des barres
     * Le premier paramètre correspond à la barre horizontale,
     * le second à la barre verticale. */
 
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
    /* Création d'une boîte de dialogue */
 
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG(window)->vbox), scrolled_window, 
                        TRUE, TRUE, 0);
    gtk_widget_show (scrolled_window);
    
    /* Création d'une table de 10x10 cases. */
 
    table = gtk_table_new (10, 10, FALSE);
    
    /* Configure l'espace des lignes et des colonnes de 10 pixels */
 
    gtk_table_set_row_spacings (GTK_TABLE (table), 10);
    gtk_table_set_col_spacings (GTK_TABLE (table), 10);
    
    /* Place la table fans la fenêtre à défilement */
 
    gtk_container_add (GTK_CONTAINER (scrolled_window), table);
    gtk_widget_show (table);
    
    /* Crée une grille de boutons commutateurs dans la table */
 
    for (i = 0; i < 10; i++)
            for (j = 0; j < 10; j++) {
                sprintf (buffer, "bouton (%d,%d)\n", i, j);
                button = gtk_toggle_button_new_with_label (buffer);
                gtk_table_attach_defaults (GTK_TABLE (table), button,
                                           i, i+1, j, j+1);
                gtk_widget_show (button);
            }
    
    /* Ajoute un bouton « Fermer » en bas de la boîte de dialogue */
 
    button = gtk_button_new_with_label ("Fermer");
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                               (GtkSignalFunc) gtk_widget_destroy,
                               GTK_OBJECT (window));
    
    /* On met ce bouton en « bouton par défaut ». */
    
    GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
    gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), button, TRUE, TRUE, 0);
    
    /* Récupère le bouton par défaut. Le fait de presser la touche « Entrée »
     * activera le bouton. */
 
    gtk_widget_grab_default (button);
    gtk_widget_show (button);
    
    gtk_widget_show (window);
    
    gtk_main();
    
    return(0);
 }

Essayez de changer la taille de la fenêtre et faites attention aux réactions des barres de défilement. On peut aussi utiliser la fonction gtk_widget_set_usize() pour configurer la taille par défaut de la fenêtre et des autres widgets.