Object +-- Widget +-- Container +-- Bin +-- ScrolledWindow
Le fenêtre défilable est utilisée pour créer une aire défilable avec un autre widget à l'intérieur. Vous pouvez insérer n'importe quel type de widget dans une fenêtre défilable et il sera accessible quelque soit sa taille grâce aux barres de défilement.
La fonction suivante crée une nouvelle fenêtre défilable.
$scrolled_window = new Gtk::ScrolledWindow( $hadjustment, $vadjustment );
Ou le premier argument est l'ajustement dans la direction horizontale et le second celui dans le direction verticale. Ils sont presque toujours déclarés en valeur nulle.
$scrolled_window->set_policy( $hscrollbar_policy, $vscrollbar_policy );
Ceci déclare la politique à utiliser avec respect pour les barres de défilement. Le premier argument déclare la politique pour les barres horizontales et le second pour les barres verticales.
Cette politique peut être soit 'automatic', soit 'always'. 'automatic'
décidera automatiquement si vous avez besoin de barres de défilement alors que
'always' laissera les barres de défilement à leurs places.
Vous pouvez maintenant placer votre objet dans la fenêtre défilable en utilisant :
$scrolled_window->add_with_viewport( $child );
Le positionnement du widget enfant en respect avec les barres de défilement peut être déclaré par :
$scrolled_window->set_placement( $placement );
Ou $placement peut être 'top_left ( le défaut ), 'top_right', 'bottom_left', 'bottom_right'.
Une valeur 'top_left' signifie que le widget est en haut à gauche avec
les barres de défilement à droite et en bas du widget.
Vous pouvez récupérer ou déclarer les ajustements des barres horizontales et verticales à l'aide de :
$scrolled_window->get_hadjustment(); $scrolled_window->get_vadjustment(); $scrolled_window->set_hadjustment( $adjustment ); $scrolled_window->set_vadjustment( $adjustment );
Voici un exemple simple qui regroupe une table avec 100 boutons toggle à l'intérieur de la fenêtre défilable.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $scrolled_window;
my $table;
my $button;
my $buffer;
my $i;
my $j;
# Crée une nouvelle fenêtre de dialogue pour y placer la fenêtre défilable.
$window = new Gtk::Dialog();
$window->signal_connect( "destroy", sub { Gtk->exit( 0 ); } );
$window->set_title( "Scrolled Window Example" );
$window->border_width( 0 );
$window->set_usize( 300, 300 );
# Crée une nouvelle fenêtre défilable.
$scrolled_window = new Gtk::ScrolledWindow( "", "" );
$scrolled_window->border_width( 10 );
# La politique est soit ``automatic'' soit ``always''.'automatic' décidera
#automatiquement si vous avez besoin de barres de défilement alors que
# 'always' laissera les barres de défilement là. Le premier est la barre
# de défilement horizontale, le second la verticale.
$scrolled_window->set_policy( "automatic", "always" );
# La fenêtre de dialogue est créée avec une vbox à l'intérieur.
$window->vbox->pack_start( $scrolled_window, $true, $true, 0 );
$scrolled_window->show();
# crée une table de 10 cases sur 10.
$table = new Gtk::Table( 10, 10, $false );
# Déclare l'espacement de 10 et x et en y
$table->set_row_spacings( 10 );
$table->set_col_spacings( 10 );
# Place la table dans la fenêtre défilable
$scrolled_window->add_with_viewport( $table );
$table->show();
# Cela crée simplement une grille de bouton toggle sur la table
# pour faire une démonstration de la fenêtre défilable
for ( $i = 0; $i < 10; $i++ ) { for ( $j = 0; $j < 10; $j++ ) { $buffer = "button (" . $i . ", " . $j . ")\n"; $button = new Gtk::ToggleButton( $buffer ); $table->attach_defaults( $button, $i, $i + 1, $j, $j + 1 ); $button->show(); } }
# Ajoute une bouton ``Close'' à la fenêtre de dialogue. Notez que plutôt
# que de sortir directement, nous indiquons plutôt la fenêtre à fermer.
# De cette manière, si nous voulons différents comportements quand on
# ferme une fenêtre, nous n'avons qu'à changer le signal connect. Un moyen
# encore meilleur serait d'appeler une fonction pour clore la fenêtre.
$button = new Gtk::Button( "Close" );
$button->signal_connect_object( "clicked", \&Gtk::widget_destory, $window );
# Cela fait que le bouton est le bouton par défaut
$button->can_default( $true );
$window->action_area->pack_start( $button, $true, $true, 0 );
# Cela rend permet de faire du bouton le bouton par défaut en faisant
# que les évènements du clavier le concerne. Ainsi, taper simplement sur la
# touche ``Enter'' et cela activera le bouton.
$button->grab_default();
$button->show();
$window->show();
main Gtk;
exit( 0 );
Amuser vous à redimensionner la fenêtre. Vous verrez comment les barres de défilements
réagissent. Vous pouvez aussi souhaiter l'appel set_usize() pour déclarer
la taille par défaut de la fenêtre ou des autres widgets.