| Programmation GTK2 en Pascal |
|
Présentation
Le contrôle GtkRadioMenuItem est un élément de menu qui est l'équivalent d'un bouton radio (GtkRadioButton).
Hiérarchie
| Hiérarchie |
GObject
└─GtkObject
└─GtkWidget
└─GtkContainer
└─GtkBin
└─GtkItem
└─GtkMenuItem
├─GtkImageMenuItem
├─GtkCheckMenuItem ─ GtkRadioMenuItem
├─GtkSeparatorMenuItem
└─GtkTearoffMenuItem |
Utilisation de base
Création
Tout comme pour le contrôle GtkRadioButton, Gtk+ utilise les listes simplement chaînées. Pour créer le groupe ainsi que le premier bouton, il faut utiliser une des ces fonctions :
function gtk_radio_menu_item_new(group : PGSList) : PGtkWidget; function gtk_radio_menu_item_new_with_label(group : PGSList; _label : Pgchar) : PGtkWidget; function gtk_radio_menu_item_new_with_mnemonic(group : PGSList; _label : Pgchar) : PGtkWidget;
Pour créer le premier élément du groupe, il faut que le paramètre group soit égal à NULL. Par contre pour ajouter des éléments supplémentaires, ce paramètre est obligatoire. Il faudra donc récupérer sa valeur avec cette fonction :
function gtk_radio_menu_item_get_group(radio_menu_item : PGtkRadioMenuItem) : PGSList;
Cette fonction doit être utilisée avant chaque ajout d'élément.
Cependant pour éviter cette étape, GTK nous offre trois autres fonctions d'ajout :
function gtk_radio_menu_item_new_from_widget(group : PGtkRadioMenuItem) : PGtkWidget; function gtk_radio_menu_item_new_with_label_from_widget(group : PGtkRadioMenuItem; _label : Pgchar) : PGtkWidget; function gtk_radio_menu_item_new_with_mnemonic_from_widget(group : PGtkRadioMenuItem; _label : Pgchar) : PGtkWidget;
Programme exemple
Nous allons créer un menu permettant le choix entre trois valeurs différentes, la valeur sélectionnée étant affichée dans un label.
Voilà le fichier gtk036.pas :
program gtk036;
uses glib2, gtk2;
procedure OnMenuItemClic(APWidget : PGtkwidget; AData : pgpointer); cdecl;
var
TexteDuMenu : pgchar;
Texte : pgchar;
begin
// Récuperation du texte du menu cliqué
TexteDuMenu := gtk_label_get_text(GTK_LABEL(GTK_BIN(APWidget)^.Child));
Texte := g_strdup_printf('%s est actif', [TexteDuMenu]);
// Affichage du texte dans le label
gtk_label_set_text(GTK_LABEL(AData), Texte);
g_free(Texte);
end;
var
pFenetre : PGtkWidget;
pVBox : PGtkWidget;
pBarreMenu : PGtkWidget;
pMenuItemAffichage : PGtkWidget;
pMenuAffichage : PGtkWidget;
pMenuItemValeur1 : PGtkWidget;
pMenuItemValeur2 : PGtkWidget;
pMenuItemValeur3 : PGtkWidget;
pLabel : PGtkWidget;
pGroupe : PGSList;
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), 'Gtk036 : Élément de menu « radio »');
gtk_signal_connect(pGTKOBJECT(pFenetre), 'destroy', GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
// Création de la GtkVBox
pVBox := gtk_vbox_new(FALSE, 5);
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 Affichage et rattachement à la barre de menu
pMenuItemAffichage := gtk_menu_item_new_with_label('Affichage');
gtk_menu_shell_append(GTK_MENU_SHELL(pBarreMenu), pMenuItemAffichage);
// Création du menu Affichage et rattachement à l'item Affichage
pMenuAffichage := gtk_menu_new;
gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItemAffichage), pMenuAffichage);
// Création de l'item « Valeur 1 » et rattachement au menu Affichage
pMenuItemValeur1 := gtk_radio_menu_item_new_with_label(NULL, 'Valeur 1');
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pMenuItemValeur1), TRUE);
gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur1);
pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur1));
// Création de l'item « Valeur 2 » et rattachement au menu Affichage
pMenuItemValeur2 := gtk_radio_menu_item_new_with_label(pGroupe, 'Valeur 2');
gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur2);
pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur2));
// Création de l'item « Valeur 3 » et rattachement au menu Affichage
pMenuItemValeur3 := gtk_radio_menu_item_new_with_label(pGroupe, 'Valeur 3');
gtk_menu_shell_append(GTK_MENU_SHELL(pMenuAffichage), pMenuItemValeur3);
pGroupe := gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItemValeur3));
// Création du label
pLabel := gtk_label_new('Valeur 1 est actif');
gtk_box_pack_start(GTK_BOX(pVBox), pLabel, TRUE, FALSE, 0);
// Signal des items « Valeur x »
g_signal_connect(pGTKOBJECT(pMenuItemValeur1), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);
g_signal_connect(pGTKOBJECT(pMenuItemValeur2), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);
g_signal_connect(pGTKOBJECT(pMenuItemValeur3), 'activate', G_CALLBACK(@OnMenuItemClic), pLabel);
gtk_widget_show_all(pFenetre);
gtk_main;
end.
Voilà ce que donne l'exécution du programme gtk036.pas après le lancement après avoir cliqué sur le menu « Affichage » et placer le curseur de la souris au dessus de « Valeur 3 » :

Puis après avoir cliqué sur « Valeur 3 » et à nouveau resélectionner le menu « Affichage », le label et le menu ont bien été modifiés :

|
Menu : GtkMenuBar ~ GtkMenu ~ GtkMenuShell — GtkMenuItem ~ GtkImageMenuItem ~ GtkCheckMenuItem ~ GtkRadioMenuItem ~ GtkSeparatorMenuItem ~ GtkTearoffMenuItem |