Page suivante Page précédente Table des matières

11. Widgets Menu

Il y a deux façons de créer des menus, la facile et la compliquée. Les deux ont leur utilité, mais on peut généralement utiliser l'usine à menus (c'est la méthode facile...). La méthode « compliquée » consiste à créer tous les menus en utilisant directement les appels. La méthode facile consiste à utiliser les appels gtk_menu_factory. C'est beaucoup plus simple, mais chaque approche a ses avantages et inconvénients.

L'usine à menus est beaucoup plus facile à utiliser, elle facilite aussi l'ajout d'autres menus. Par contre, écrire quelques fonctions permettant de créer des menus en utilisant la méthode manuelle peut être le début d'un long chemin avant une quelconque utilisation. Avec l'usine à menus, il n'est pas possible d'ajouter des images ou des « / » aux menus.

11.1 Création manuelle de menus

Selon la tradition pédagogique, nous commencerons par le plus compliqué :)

Regardons les fonctions utilisées pour créer les menus. La première sert à créer un nouveau menu.

GtkWidget *gtk_menu_bar_new()

Cette fonction crée une nouvelle barre de menu. On utilise la fonction gtk_container_add pour la placer dans une fenêtre, ou les fonctions box_pack pour la placer dans une boîte - la même que pour les boutons.

GtkWidget *gtk_menu_new();

Cette fonction retourne un pointeur vers un nouveau menu, il n'est jamais montré (avec gtk_widget_show), il ne fait que contenir les items du menu. Ceci deviendra plus clair lorsque nous étudierons l'exemple ci-dessous.

Les deux appels suivants servent à créer des items de menu qui seront placés dans le menu.

GtkWidget *gtk_menu_item_new()

et

GtkWidget *gtk_menu_item_new_with_label(const char *label)

Ces appels servent à créer les menus qui doivent être affichés. On doit bien faire la différence entre un « menu » qui est créé avec gtk_menu_new() et un « item de menu » créé avec les fonctions gtk_menu_item_new(). L'item de menu sera un véritable bouton avec une action associée alors qu'un menu sera un container contenant les items.

gtk_menu_item_append()

gtk_menu_item_set_submenu()

Les fonctions gtk_menu_new_with_label() et gtk_menu_new() sont telles que vous les attendiez après avoir étudié les boutons. L'une crée un nouvel item de menu contenant déjà un label, et l'autre ne fait que créer un item de menu vide.

Voici les étapes pour créer une barre de menu avec des menus attachés :

La création d'un menu surgissant est presque identique. La différence est que le menu n'est pas posté « automatiquement » par une barre de menu, mais explicitement en appelant la fonction gtk_menu_popup() par un événement « bouton pressé ».

Suivez ces étapes 

11.2 Exemple de menu manuel


#include <gtk/gtk.h>

static gint button_press (GtkWidget *, GdkEvent *);
static void menuitem_response (GtkWidget *, gchar *);


int main (int argc, char *argv[])
{

    GtkWidget *window;
    GtkWidget *menu;
    GtkWidget *menu_bar;
    GtkWidget *root_menu;
    GtkWidget *menu_items;
    GtkWidget *vbox;
    GtkWidget *button;
    char buf[128];
    int i;

    gtk_init (&argc, &argv);

    /* Création d'un fenêtre */

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW (window), "Test de Menu GTK");
    gtk_signal_connect(GTK_OBJECT (window), "delete_event",
                       (GtkSignalFunc) gtk_exit, NULL);

    /* Initialise le widget menu -- Attention : n'appelez jamais 
     * gtk_show_widget() pour le widget menu !!!
     * C'est le menu qui contient les items de menu, celui qui surgira 
     * lorsque vous cliquez sur le « menu racine » de l'application. */

    menu = gtk_menu_new();

    /* Voici le menu racine dont le label sera le nom du menu affiché sur la barre
     * de menu. Il n'a pas de gestionnaire de signal attaché car il ne fait 
     * qu'afficher le reste du menu lorsqu'il est pressé. */

    root_menu = gtk_menu_item_new_with_label("Menu racine");

    gtk_widget_show(root_menu);

    /* Puis, on crée une petite boucle créant trois entrées pour « menu test »
     * Notez l'appel à gtk_menu_append(). Ici, on ajoute une liste d'items à
     * notre menu. Normalement, on devrait aussi capturer le signal "clicked" 
     * pour chacun des items et configurer une fonction de rappel pour lui, 
     * mais on l'a omis ici pour gagner de la place. */

    for(i = 0; i < 3; i++)
        {
            /* Copie des noms dans buf. */

            sprintf(buf, "Sous-menu Test - %d", i);

            /* Création d'un nouveau item de menu avec un nom... */

            menu_items = gtk_menu_item_new_with_label(buf);

            /* ...et ajout de celui-ci dans le menu. */

            gtk_menu_append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item est
             * sélectionné. */

            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(char *argv[])
{

append(GTK_MENU (menu), menu_items);

            /* On fait quelque chose d'intéressant lorsque l'item e