Programmation GTK2 en Pascal/GtkMenu

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche
Programmation GTK2 en Pascal

Présentation[modifier | modifier le wikicode]

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 | modifier le wikicode]

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

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_new : PGtkWidget;

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

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 | modifier le wikicode]

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 | modifier le wikicode]

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 » :

Programmation GTK2 en Pascal - gtk033.png


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