begin process at 2008 08 08 21:43:17
1 223 607 membres
365 nouveaux aujourd'hui
14 230 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CREATION D'UN MENU AVEC GTK


Information sur la source

Catégorie :GTK+ Niveau : Initié Date de création : 18/09/2001 Vu : 10 663

Note :
7,25 / 10 - par 4 personnes
7,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

Description

Ce code vous permet de cree un menu contextuel simple

Source

  • #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(menuitem_response), (gpointer)
  • g_strdup(buf));
  • /* Affichage du widget. */
  • gtk_widget_show(menu_items);
  • }
  • /* Maintenant, on spécifié que nous voulons que notre nouveau « menu »
  • * soit le menu du « menu racine ». */
  • gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);
  • /* Création d'une vbox pour y mettre un menu et un bouton. */
  • vbox = gtk_vbox_new(FALSE, 0);
  • gtk_container_add(GTK_CONTAINER(window), vbox);
  • gtk_widget_show(vbox);
  • /* Création d'une barre de menus pour contenir les menus. Puis, on
  • * l'ajoute à notre fenêtre principale. */
  • menu_bar = gtk_menu_bar_new();
  • gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
  • gtk_widget_show(menu_bar);
  • /* Création d'un bouton pour y attacher le menu. */
  • button = gtk_button_new_with_label("Pressez moi");
  • gtk_signal_connect_object(GTK_OBJECT(button), "event",
  • GTK_SIGNAL_FUNC (button_press), GTK_OBJECT(menu));
  • gtk_box_pack_end(GTK_BOX(vbox), button, TRUE, TRUE, 2);
  • gtk_widget_show(button);
  • /* Finalement, on ajoute l'item de menu à la barre de menu --
  • * c'est l'item de menu racine sur lequel je me suis déchaîné ;-) */
  • gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), root_menu);
  • /* Affichage de la fenêtre. */
  • gtk_widget_show(window);
  • gtk_main ();
  • return 0;
  • }
  • /* On répond à un appui sur le bouton en postant un nouveau menu passé comme
  • * un widget.
  • *
  • * On remarque que le paramètre "widget" est le menu à poster, PAS le bouton
  • * qui a été pressé. */
  • static gint button_press (GtkWidget *widget, GdkEvent *event)
  • {
  • if (event->type == GDK_BUTTON_PRESS) {
  • GdkEventButton *bevent = (GdkEventButton *) event;
  • gtk_menu_popup (GTK_MENU(widget), NULL, NULL, NULL, NULL,
  • bevent->button, bevent->time);
  • /* On indique à l'appelant que l'on a géré cet événement. */
  • return TRUE;
  • }
  • /* On indique à l'appelant que l'on n'a pas géré cet événement. */
  • return FALSE;
  • }
  • /* Affiche une chaîne lorsqu'un item de menu est choisi. */
  • static void menuitem_response (GtkWidget *widget, gchar *string)
  • {
  • printf("%s\n", string);
  • }
#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(menuitem_response), (gpointer)
                g_strdup(buf));
                      
            /* Affichage du widget. */

            gtk_widget_show(menu_items);
        }

    /* Maintenant, on spécifié que nous voulons que notre nouveau « menu »
     * soit le menu du « menu racine ». */

    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);

    /* Création d'une vbox pour y mettre un menu et un bouton. */

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), vbox);
    gtk_widget_show(vbox);

    /* Création d'une barre de menus pour contenir les menus. Puis, on
     * l'ajoute à notre fenêtre principale. */

    menu_bar = gtk_menu_bar_new();
    gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
    gtk_widget_show(menu_bar);

    /* Création d'un bouton pour y attacher le menu. */

    button = gtk_button_new_with_label("Pressez moi");
    gtk_signal_connect_object(GTK_OBJECT(button), "event",
        GTK_SIGNAL_FUNC (button_press), GTK_OBJECT(menu));
    gtk_box_pack_end(GTK_BOX(vbox), button, TRUE, TRUE, 2);
    gtk_widget_show(button);

    /* Finalement, on ajoute l'item de menu à la barre de menu --
     * c'est l'item de menu racine sur lequel je me suis déchaîné ;-) */

    gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), root_menu);

    /* Affichage de la fenêtre. */

    gtk_widget_show(window);

    gtk_main ();

    return 0;
}



/* On répond à un appui sur le bouton en postant un nouveau menu passé comme 
 * un widget.
 *
 * On remarque que le paramètre "widget" est le menu à poster, PAS le bouton
 * qui a été pressé. */


static gint button_press (GtkWidget *widget, GdkEvent *event)
{

    if (event->type == GDK_BUTTON_PRESS) {
        GdkEventButton *bevent = (GdkEventButton *) event; 
        gtk_menu_popup (GTK_MENU(widget), NULL, NULL, NULL, NULL,
                        bevent->button, bevent->time);

        /* On indique à l'appelant que l'on a géré cet événement. */

        return TRUE;
    }

    /* On indique à l'appelant que l'on n'a pas géré cet événement. */

    return FALSE;
}


/* Affiche une chaîne lorsqu'un item de menu est choisi. */

static void menuitem_response (GtkWidget *widget, gchar *string)
{
    printf("%s\n", string);
}
 
  • signaler à un administrateur
    Commentaire de kortin le 11/06/2004 21:14:11

    il y a plusieurs erreur avec devC++.

    Je ne sais pas quel version utilise, je ne peux pas te signaler les erreurs, je débute seulement avec GTK.


    implicit declaration of function `int sprintf(...)'
    [Warning] In function `void menuitem_response(GtkWidget *, gchar *)':
    implicit declaration of function `int printf(...)'
    [Build Error]  [main.o] Error 1

    tu peux mettre à jour ton programme stp, j'ai besoin de voir quelques exemples qui fonctionnent

  • signaler à un administrateur
    Commentaire de jabirmed le 26/01/2007 16:05:26

    pour que ce programme camarche bien il faut instaler les pack de GTK
    jabir mohamed mon email pour + des information jabir@mohamed.tr

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS