Programmation GTK2 en Pascal/GtkMenuBar

Un livre de Wikilivres.
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

Le contrôle GtkMenuBar permet de gérer une barre de menu dans une fenêtre.

Hiérarchie[modifier | modifier le wikicode]

Hiérarchie
GObject
  └─GtkObject
      └─GtkWidget
          └─GtkContainer
              └─GtkMenuShell
                  └─GtkMenuBar

Utilisation de base[modifier | modifier le wikicode]

Création[modifier | modifier le wikicode]

La fonction de création d'une barre de menu est simple :

function gtk_menu_bar_new : PGtkWidget;

Ajout d'élément[modifier | modifier le wikicode]

Pour ajouter des éléments dans une GtkMenuBar, il faut utiliser les fonctions du contrôle GtkMenuShell :

procedure gtk_menu_shell_append(menu_shell : PGtkMenuShell; child : PGtkWidget);
procedure gtk_menu_shell_prepend(menu_shell : PGtkMenuShell; child : PGtkWidget);

La première fonction ajoute les éléments de gauche à droite alors que la seconde les ajoute de droite à gauche. Le paramètre menu_shell est le GtkMenuBar dans laquelle nous voulons ajouter l'élément et le paramètre child est l'élément à ajouter. Pour le premier paramètre, il faudra utiliser la fonction de conversion GTK_MENU_SHELL.

Programme exemple[modifier | modifier le wikicode]

Nous allons créer dans une fenêtre une barre de menu dans laquelle nous allons ajouter un item de menu qui permettra de quitter l'application.

Voilà le fichier gtk032.pas :

program gtk032;

uses glib2, gtk2;

procedure OnQuitter(AWidget : PGtkwidget; AData : PGPointer); cdecl;
var
  pQuestion : PGtkWidget;
begin
  // Création de la boîte de message 
  pQuestion := gtk_message_dialog_new(GTK_WINDOW(AData),
                 GTK_DIALOG_MODAL,
                 GTK_MESSAGE_QUESTION,
                 GTK_BUTTONS_YES_NO,
                 'Voulez-vous vraiment'#13#10'quitter le programme ?');

  // Affichage de la boîte de message 
  case gtk_dialog_run(GTK_DIALOG(pQuestion)) of
    GTK_RESPONSE_YES : gtk_main_quit;
    GTK_RESPONSE_NONE, GTK_RESPONSE_NO : gtk_widget_destroy(pQuestion);
  end; 
end;

var
  pFenetre   : PGtkWidget;
  pVBox	     : PGtkWidget;
  pBarreMenu : PGtkWidget;
  pItemMenu  : 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_window_set_title(GTK_WINDOW(pFenetre), 'Gtk032 : Barre de menu');
  gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);

  // Création de la GtkVBox
  pVBox := gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(pFenetre), pVBox);

  // Création de la barre de menu
  pBarreMenu := gtk_menu_bar_new;
  gtk_box_pack_start(GTK_BOX(pVBox), pBarreMenu, FALSE, FALSE, 0);

  // Création du GtkMenuItem Quitter
  pItemMenu := gtk_menu_item_new_with_label('Quitter');
  g_signal_connect(pGTKOBJECT(pItemMenu), 'activate', G_CALLBACK(@OnQuitter), pGTKOBJECT(pFenetre));
  gtk_menu_shell_append(GTK_MENU_SHELL(pBarreMenu), pItemMenu);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

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


Menu : GtkMenuBar ~ GtkMenu ~ GtkMenuShellGtkMenuItem ~ GtkImageMenuItem ~ GtkCheckMenuItem ~ GtkRadioMenuItem ~ GtkSeparatorMenuItem ~ GtkTearoffMenuItem