Programmation GTK2 en Pascal/GtkMenu

Programmation GTK2 en Pascal

Présentation modifier

Le contrôle GtkMenu est celui qui s'ouvre quand on clique sur un item de menu dans la barre de menu.

Hiérarchie modifier

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

Utilisation de base modifier

Création modifier

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

function gtk_menu_new : PGtkWidget;

Ajout d'élément modifier

Pour ajouter des éléments dans un GtkMenu, il faut comme dans une GtkMenuBar 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 GtkMenu 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.

Ajout du menu modifier

Pour ajouter un menu à une barre de menu, ou pour créer un sous-menu, il faut associer le menu avec un élément (de la barre de menu ou du menu parent) avec une fonction du contrôle GtkMenuItem :

procedure gtk_menu_item_set_submenu(menu_item : PGtkMenuItem; submenu : PGtkWidget);

Cette fonction est étudié plus en détail dans le chapitre sur le contrôle GtkMenuItem.

Programme exemple modifier

Nous allons créer un menu « Fichier » qui contiendra un élément « Ouvrir » et un élément « Quitter ». L'élément « Quitter » ouvrira un autre menu qui proposera les options « OUI » et « NON ». Ce qui n'est pas très réaliste mais permet de voir un menu et un sous-menu.

Voilà le fichier gtk033.pas :

program gtk033;

uses glib2, gtk2;

var
  pFenetre   : PGtkWidget;
  pVBox      : PGtkWidget;
  pBarreMenu : PGtkWidget;
  pMenuItemFichier : PGtkWidget;
  pMenuFichier     : PGtkWidget;
  pMenuItemOuvrir  : PGtkWidget;
  pMenuItemQuitter : PGtkWidget;
  pMenuQuitter     : PGtkWidget;
  pMenuItemOui     : PGtkWidget;
  pMenuItemNon     : 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), 'Gtk033 : Menu et sous-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 de l'item Fichier et rattachement à la barre de menu
  pMenuItemFichier := gtk_menu_item_new_with_label('Fichier');
  gtk_menu_shell_append(GTK_MENU_SHELL(pBarreMenu), pMenuItemFichier);

  // Création du menu Fichier et rattachement à l'item Fichier
  pMenuFichier := gtk_menu_new;
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItemFichier), pMenuFichier);

  // Création de l'item Ouvrir et rattachement au menu Fichier
  pMenuItemOuvrir := gtk_menu_item_new_with_label('Ouvrir');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuFichier), pMenuItemOuvrir);

  // Création de l'item Quitter et rattachement au menu Fichier
  pMenuItemQuitter := gtk_menu_item_new_with_label('Quitter');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuFichier), pMenuItemQuitter);

  // Création du (sous-)menu Quitter et rattachement à l'item Quitter
  pMenuQuitter := gtk_menu_new;
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItemQuitter), pMenuQuitter);

  // Création de l'item Oui et rattachement au menu Quitter
  pMenuItemOui := gtk_menu_item_new_with_label('Oui');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuQuitter), pMenuItemOui);
  // Création de l'item Non et rattachement au menu Quitter
  pMenuItemNon := gtk_menu_item_new_with_label('Non');
  gtk_menu_shell_append(GTK_MENU_SHELL(pMenuQuitter), pMenuItemNon);

  // Oui -> quitte l'application
  g_signal_connect(pGTKOBJECT(pMenuItemOui), 'activate', G_CALLBACK(@gtk_main_quit), NULL);

  gtk_widget_show_all(pFenetre);
  gtk_main;
end.

Voilà ce que donne l'exécution du programme gtk033 après avoir cliquer sur le menu « Fichier » puis « Quitter » :

 


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