| Programmation GTK2 en Pascal |
|
Présentation
Le contrôle GtkMenu est celui qui s'ouvre quand on clique sur un item de menu dans la barre de menu.
Hiérarchie
| Hiérarchie |
GObject
└─GtkObject
└─GtkWidget
└─GtkContainer
└─GtkMenuShell
└─GtkMenu |
Utilisation de base
Création
La fonction de création d'une barre de menu est simple :
function gtk_menu_new : PGtkWidget;
Ajout d'élément
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
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
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 ~ GtkMenuShell — GtkMenuItem ~ GtkImageMenuItem ~ GtkCheckMenuItem ~ GtkRadioMenuItem ~ GtkSeparatorMenuItem ~ GtkTearoffMenuItem |