Programmation GTK2 en Pascal/GtkRadioMenuItem
Programmation GTK2 en Pascal |
|
Présentation
modifierLe contrôle GtkRadioMenuItem est un élément de menu qui est l'équivalent d'un bouton radio (GtkRadioButton
).
Hiérarchie
modifierHiérarchie |
GObject └─GtkObject └─GtkWidget └─GtkContainer └─GtkBin └─GtkItem └─GtkMenuItem ├─GtkImageMenuItem ├─GtkCheckMenuItem ─ GtkRadioMenuItem ├─GtkSeparatorMenuItem └─GtkTearoffMenuItem |
Utilisation de base
modifierCréation
modifierTout 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
modifierNous 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 |