Aller au contenu

Programmation GTK2 en Pascal/GtkButton

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Élément essentiel d'une interface graphique, le contrôle GtkButton est un bouton de base, une zone rectangulaire mis en valeur par un relief et un label. Gtk+ permet néanmoins d'aller plus loin, en pouvant lui ajouter des éléments comme des images « pixmap » ou autres.

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkBin
                  └─GtkButton

Utilisation de base

[modifier | modifier le wikicode]

Création d'un bouton

[modifier | modifier le wikicode]

Pour créer un bouton, Gtk+ permet l'utilisation de quatre fonctions différentes :

function gtk_button_new : PGtkWidget;
function gtk_button_new_with_label(_label : Pgchar) : PGtkWidget;
function gtk_button_new_with_mnemonic(_label : Pgchar) : PGtkWidget;
function gtk_button_new_from_stock(stock_id : Pgchar) : PGtkWidget;

La première fonction permet de créer un bouton vide. Cela permet de personnaliser complètement le bouton car GtkButton dérive de GtkContainer. On peut donc inclure n'importe quel type de contrôle dans le bouton (GtkLabel, GtkImage, etc.). Comme il dérive également de GtkBin, il ne peut contenir qu'un seul contrôle, il faudra donc passer par un GtkBox pour inclure plusieurs contrôles.

La deuxième fonction s'occupe en plus d'insérer un label à l'intérieur du bouton. Le paramètre _label (le caractère souligné permet d'éviter d'utiliser « label » directement qui est un mot réservé en Pascal) correspond au texte à afficher. Comme pour le contrôle GtkLabel, si un caractère accentué est utilisé, il faudra appeler la fonction g_locale_to_utf8 pour avoir un affichage correct du texte.

La troisième fonction ajoute à cela une nouvelle fonctionnalité. Elle permet, en plus d'afficher un label, de faire réagir le bouton à l'aide d'un raccourci clavier. La touche servant de raccourci est spécifiée dans le paramètre label. Il suffit de mettre « _ » devant la lettre souhaitée pour que la combinaison Atl+Touche active le bouton.

La quatrième fonction permet de créer un bouton avec un label, un raccourci clavier et une image. Cependant, pour faire cela, Gtk+ utilise les GtkStockItem qui est une structure contenant les informations sur le label et l'image à afficher. Gtk+ comporte déjà beaucoup de GtkStockItem prédéfinis (en tout cas les plus courant). Le paramètre stock_id est donc l'identifiant du GtkStockItem à utiliser.

Une fois le bouton créé, il ne reste plus qu'à l'inclure dans une fenêtre et de connecter le signal clicked, pour qu'un clic de souris sur le bouton corresponde à une action précise.

Modifier le texte d'un bouton

[modifier | modifier le wikicode]

À tout moment pendant l'exécution du programme, nous pouvons connaître ou modifier le texte d'un bouton à l'aide d'une de ces deux fonctions :

function gtk_button_get_label(button : PGtkButton) : Pgchar;
procedure gtk_button_set_label(button : PGtkButton; _label : Pgchar);

La première fonction renvoie le texte du bouton button (premier paramètre), tandis que la deuxième modifie le texte du bouton par la valeur du deuxième paramètre _label.

Programme exemple

[modifier | modifier le wikicode]

Pour ce chapitre, notre objectif sera de créer une application contenant trois boutons qui permettront de quitter l'application, un avec un label simple, un autre avec un label muni d'un raccourci clavier et le troisième avec une image issu du stock de bouton.

Voilà le fichier gtk020.pas :

program gtk020;

uses glib2, gtk2;

var
  pFenetre    : PGtkWidget;
  pVBox       : PGtkWidget;
  pBtn        : PGtkWidget;
begin
  gtk_init(@argc, @argv);
  pFenetre := gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(pFenetre), GTK_WIN_POS_CENTER);
  gtk_window_set_default_size(GTK_WINDOW(pFenetre), 320, 200);
  gtk_container_set_border_width(GTK_CONTAINER(pFenetre), 4);
  gtk_window_set_title(GTK_WINDOW(pFenetre), 'Gtk020 : Bouton');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  pVBox := gtk_vbox_new(TRUE, 0);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création du bouton 1
  pBtn := gtk_button_new_with_label('Quitter');
  gtk_box_pack_start(GTK_BOX(pVBox), pBtn, TRUE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pBtn), 'clicked', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création du bouton 2
  pBtn := gtk_button_new_with_mnemonic('_Quitter');
  gtk_box_pack_start(GTK_BOX(pVBox), pBtn, TRUE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pBtn), 'clicked', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création du bouton 3
  pBtn := gtk_button_new_from_stock(GTK_STOCK_QUIT);
  gtk_box_pack_start(GTK_BOX(pVBox), pBtn, TRUE, FALSE, 5);
  g_signal_connect(pGTKOBJECT(pBtn), 'clicked', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voilà ce que donne l'exécution du programme gtk020 :

Boutons : GtkButton ~ GtkToggleButton ~ GtkCheckButton ~ GtkRadioButton