Les fenêtres avec barres de défilement.
Nous allons cette fois voir un widget qui permet d'ajouter des barres de défilement
au widget qui sera son enfant. Il s'agit d'un widget container qui s'appelle GtkScrolledWindow.
1. Création et utilisation d'une GtkScrolledWindow
1.1 Création
Comme vous pouvez vous y attendre, la fonction de création et comme
toutes les autres, c'est à dire prévisible.
GtkWidget* gtk_scrolled_window_new(GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
Les paramètres hadjustment et vadjustment permettent de
définir les propriétés des barres de défilement.
L'objet GtkAdjustment permet dans notre cas, de définir (entre autres)
la valeur minimale que peut prendre la barre de défilement, le pas de
celle-ci.
Mais à moins de connaître exactement tous ces paramètres,
il vaut mieux laisser faire Gtk, et mettre hadjustment et vadjustment à
NULL.
1.2 Ajout du widget enfant.
Pour cela, il y a deux cas différents. Si par exemple le widget enfant
a la capacité d'avoir ses propres barres de défilements, il suffit
d'utiliser la fonction gtk_container_add.
Par contre, dans le cas ou le widget ne possède pas cette capacité,
il faudra utiliser cette fonction :
void gtk_scrolled_window_add_with_viewport(GtkScrolledWindow
*scrolled_window, GtkWidget *child);
Avec cette fonction, Gtk va créer ce qu'il s'appelle un viewport (qui
peut avec des barres de défilement) et va insérer l'enfant dans
ce viewport.
Seuls les widgets GtkTreeView, GtkTextView, et GtkLayout ont la possibilité
d'avoir des barres défilements. Pour les autres widgets (comme les GtkHBox,
GtkVBox, ...) il faudra utiliser la deuxième fonction.
1.3 Affichage des barres de défilement.
Les barres de défilement s'affichent automatiquement (que ce soit la
barre horizontale ou verticale). Il se peut que, par exemple, vous n'ayez besoin
que de la barre verticale. Dans ce cas vous ne voulez sûrement pas avoir
de barre de défilement horizontale. La solution à votre problème
est cette fonction :
void gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
GtkPolicyType hscroll_policy, GtkPolicyType vscroll_policy);
Les paramètres hscroll_policy et vscroll_policy peuvent
prendre trois paramètres :
- GTK_POLICY_ALWAYS : la barre de défilement est toujours affichée.
- GTK_POLICY_AUTOMATIC : la barre de défilement n'est affichée
que si elle est utile.
- GTK_POLICY_NEVER : la barre de défilement n'est jamais affichée.
Au contraire, pour savoir si elles sont affichées ou pas, il y a la
fonction :
void gtk_scrolled_window_get_policy (GtkScrolledWindow *scrolled_window,
GtkPolicyType *hscroll_policy, GtkPolicyType *vscroll_policy);
1.4 Construction du programme exemple.
Notre exemple est très simple. Il consiste uniquement à afficher
10 labels les uns au-dessus des autres dans une fenêtre qui n'excèdera
pas une taille de 320x200. Voyons à quoi ressemble notre fenêtre
si elle n'utilise pas les barres de défilement.
Et voila le résultat, la fenêtre ne respecte pas la condition TAILLE
= 320x200. Il faut utiliser le widget GtkScrolledWindow.
Après avoir créer notre fenêtre principale, il faut créer
notre widget et l'insérer dans la fenêtre :
scrollbar = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(window),scrollbar);
Ensuite les labels seront contenus dans une GtkVBox qu'il faut insérer
ainsi dans notre GtkScrolledWindow :
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollbar),
box);
Puisque nous n'avons pas besoin de la barre de défilement horizontale,
on la supprime :
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar),
GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
Et voila notre toute nouvelle fenêtre est crée.
1.5 Programme exemple.
#include <gtk/gtk.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
GtkWidget* window;
GtkWidget* box;
GtkWidget *scrollbar;
int i;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 320, 200);
gtk_window_set_title(GTK_WINDOW(window), "GtkScrolledWindow");
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),0);
scrollbar = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(window),scrollbar);
box=gtk_vbox_new(FALSE,5);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrollbar), box);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollbar), GTK_POLICY_NEVER,
GTK_POLICY_ALWAYS);
for(i = 1 ; i <= 10 ; ++i)
{
GtkWidget *label;
char texte[10];
sprintf(texte, "Label %d", i);
label = gtk_label_new(texte);
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
}
gtk_widget_show_all(window);
gtk_main();
return 0;
} |
Résultat :
|
2. En savoir plus.
2.1 Signaux.
| move-focus-out |
| Prototype fonction callback : void user_function(GtkScrolledWindow
*scrolledwindow, GtkDirectionType arg1, gpointer user_data); |
| scroll-child |
| Prototype fonction callback : void user_function(GtkScrolledWindow
*scrolledwindow, GtkScrollType arg1, gboolean arg2, gpointer user_data); |
2.2 Fonctions documentées.
| GtkAdjustment* gtk_scrolled_window_get_hadjustment(GtkScrolledWindow
*scrolled); |
Pour obtenir les paramètres de la barre de défilement
horizontale. Entrée(s) : scrolled
: la fenêtre. Sortie : un pointeur sur la structure
GtkAdjustment contenant les paramètres. |
| GtkAdjustment* gtk_scrolled_window_get_vadjustment(GtkScrolledWindow
*scrolled); |
Pour obtenir les paramètres de la barre de défilement
verticale. Entrée(s) : scrolled
: la fenêtre. Sortie : un pointeur sur la structure
GtkAdjustment contenant les paramètres. |
| void gtk_scrolled_window_set_hadjustment(GtkScrolledWindow
*scrolled, GtkAdjustment *hadjustment); |
Définit les paramètres de la barre de défilement
horizontale. Entrée(s) : scrolled
: la fenêtre. hadjustment : structure contenant les paramètres
à appliquer. Sortie : rien. |
| void gtk_scrolled_window_set_vadjustment(GtkScrolledWindow
*scrolled, GtkAdjustment *vadjustment); |
Définit les paramètres de la barre de défilement
verticale. Entrée(s) : scrolled :
la fenêtre. vadjustment : structure contenant les paramètres
à appliquer. Sortie : rien. |
| void gtk_scrolled_window_set_shadow_type(GtkScrolledWindow
*scrolled, GtkShadowType type); |
Modifie l'aspect du bord du widget enfant à la
GtkScrolledWindow. Entrée(s) : scrolled
: la fenêtre. type : une valeur parmi *GTK_SHADOW_NONE,
*GTK_SHADOW_IN,
*GTK_SHADOW_OUT,
*GTK_SHADOW_ETCHED_IN,
*GTK_SHADOW_ETCHED_OUT. Sortie : rien. |
| GtkShadowType gtk_scrolled_window_get_shadow_type(GtkScrolledWindow
*scrolled); |
Pour connaitre l'aspect du bord du widget enfant.
Entrée(s) : scrolled : la fenêtre.
Sortie : type de l'aspect. |
| void gtk_scrolled_window_set_placement(GtkScrolledWindow
*scrolled, GtkCornerType window_placement); |
Définit la position du widget enfant par rapport
aux barres de défilement. Entrée(s) :
scrolled : la fenêtre.
window_placement : la position du widget, peut être *GTK_CORNER_TOP_LEFT
-> en dessus à gauche, *GTK_CORNER_BOTTOM_LEFT
-> en dessous à gauche, *GTK_CORNER_TOP_RIGHT
-> en dessus à droite, *GTK_CORNER_BOTTOM_RIGHT
-> en dessous à droite. Sortie :
rien. |
| GtkCornerType gtk_scrolled_window_get_placement(GtkScrolledWindow
*scrolled); |
Pour obtenir la position du widget enfant par rapport
aux barres de défilement. Entrée(s) :
scrolled : la fenêtre. Sortie : la position
du widget. |
Date de mise à jour : 06 octobre 2002