/* Menu avancé http://www.gtk-fr.org/wakka.php?wiki=LesMenus gcc `pkg-config --cflags --libs gtk+-2.0` -o 25b 25b.c &&./25b */ #include <stdlib.h> #include <gtk/gtk.h> void OnQuitter(GtkWidget* widget, gpointer data); void OnAbout(GtkWidget* widget, gpointer data); void OnRadio(GtkWidget* widget, gpointer data); void OnTearoff(GtkWidget* widget, gpointer data); void OnCheck(GtkWidget* widget, gpointer data); static GtkWidget *pRadioLabel; static GtkWidget *pCheckLabel; static GtkWidget *pTearoffLabel; int main(int argc, char **argv) { GtkWidget *pWindow; GtkWidget *pVBox; GtkWidget *pVBox2; GtkWidget *pMenuBar; GtkWidget *pMenu; GtkWidget *pMenuItem; GSList *pList; gchar *sTempLabel; gtk_init(&argc, &argv); /* Creation de la fenetre */ pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(pWindow), "GtkMenu"); gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200); g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL); /* Creation de la GtkVBox */ pVBox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(pWindow), pVBox); /**** Creation du menu ****/ /* ETAPE 1 */ pMenuBar = gtk_menu_bar_new(); /** Premier sous-menu **/ /* ETAPE 2 */ pMenu = gtk_menu_new(); /* ETAPE 3 */ /* GtkTearoffMenuItem */ pMenuItem = gtk_tearoff_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); g_signal_connect(G_OBJECT(pMenuItem),"activate",G_CALLBACK(OnTearoff),(gpointer)pMenu); /* GtkImageMenuItem */ pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); /* GtkSeparatorItem */ pMenuItem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); /* GtkRadioMenuItem */ pMenuItem = gtk_radio_menu_item_new_with_label(NULL, "Radio 1"); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); /* Il est inutile ici d'utiliser le signal "toggled" */ g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnRadio), NULL); pMenuItem = gtk_radio_menu_item_new_with_label(pList, "Radio 2"); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); g_signal_connect(G_OBJECT(pMenuItem) ,"activate", G_CALLBACK(OnRadio), NULL); pMenuItem = gtk_radio_menu_item_new_with_label(pList, "Radio 3"); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem)); g_signal_connect(G_OBJECT(pMenuItem) ,"activate", G_CALLBACK(OnRadio), NULL); /* GtkSeparatorItem */ pMenuItem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); /* GtkCheckMenuItem */ pMenuItem = gtk_check_menu_item_new_with_label("Check"); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); g_signal_connect(G_OBJECT(pMenuItem),"toggled",G_CALLBACK(OnCheck),(gpointer)pMenu); /* GtkSeparatorItem */ pMenuItem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,NULL); g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnQuitter), (GtkWidget*) pWindow); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); /* ETAPE 4 */ pMenuItem = gtk_menu_item_new_with_label("Fichier"); /* ETAPE 5 */ gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu); /* ETAPE 6 */ gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem); /** Deuxieme sous-menu **/ /* ETAPE 2 */ pMenu = gtk_menu_new(); /* ETAPE 3 */ pMenuItem = gtk_menu_item_new_with_label("A propos de..."); g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnAbout), (GtkWidget*) pWindow); gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem); /* ETAPE 4 */ pMenuItem = gtk_menu_item_new_with_label("?"); /* ETAPE 5 */ gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu); /* ETAPE 6 */ gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem); /* Creation de la deuxieme GtkVBox (pour les labels) */ pVBox2 = gtk_vbox_new(FALSE, 0); pRadioLabel = gtk_label_new("Radio 1 est actif"); gtk_box_pack_start(GTK_BOX(pVBox2), pRadioLabel, TRUE, TRUE, 0); sTempLabel = g_locale_to_utf8("Check est décoché", -1, NULL, NULL, NULL); pCheckLabel = gtk_label_new(sTempLabel); g_free(sTempLabel); gtk_box_pack_start(GTK_BOX(pVBox2), pCheckLabel, TRUE, TRUE, 0); //sTempLabel = g_locale_to_utf8("Menu attaché", -1, NULL, NULL, NULL); //pTearoffLabel = gtk_label_new(sTempLabel); //g_free(sTempLabel); pTearoffLabel = gtk_label_new("Menu attaché"); gtk_box_pack_start(GTK_BOX(pVBox2), pTearoffLabel, TRUE, TRUE, 0); /* Ajout du menu a la fenetre */ gtk_box_pack_start(GTK_BOX(pVBox), pMenuBar, FALSE, FALSE, 0); /* Ajout des labels a la fenetre */ gtk_box_pack_start(GTK_BOX(pVBox), pVBox2, TRUE, TRUE, 0); gtk_widget_show_all(pWindow); gtk_main(); return EXIT_SUCCESS; } void OnRadio(GtkWidget* widget, gpointer data) { const gchar *sRadioName; gchar *sLabel; /* Recuperer le label du bouton radio active */ sRadioName = gtk_label_get_label(GTK_LABEL(GTK_BIN(widget)->child)); sLabel = g_strdup_printf("%s est actif",sRadioName); gtk_label_set_label(GTK_LABEL(pRadioLabel), sLabel); g_free(sLabel); } void OnCheck(GtkWidget* widget, gpointer data) { gboolean bCoche; gchar *sLabel; gchar *sLabelUtf8; /* Savoir si le GtkCheckMenuItem est coche ou non */ bCoche = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); if(bCoche) sLabel = g_strdup("Check est coché"); else sLabel = g_strdup("Check est décoché"); sLabelUtf8 = g_locale_to_utf8(sLabel, -1, NULL, NULL, NULL); gtk_label_set_label(GTK_LABEL(pCheckLabel), sLabelUtf8); g_free(sLabel); g_free(sLabelUtf8); } void OnTearoff(GtkWidget* widget, gpointer data) { gboolean bDetache; gchar *sLabel; gchar *sLabelUtf8; /* Savoir si le menu est detache ou non */ bDetache = gtk_menu_get_tearoff_state(GTK_MENU(data)); if(bDetache) sLabel = g_strdup("Menu détaché"); else sLabel = g_strdup("Menu attaché"); sLabelUtf8 = g_locale_to_utf8(sLabel, -1, NULL, NULL, NULL); gtk_label_set_label(GTK_LABEL(pTearoffLabel), sLabelUtf8); g_free(sLabel); g_free(sLabelUtf8); } void OnQuitter(GtkWidget* widget, gpointer data) { GtkWidget *pQuestion; pQuestion = gtk_message_dialog_new(GTK_WINDOW(data), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Voulez vous vraiment\n" "quitter le programme?"); switch(gtk_dialog_run(GTK_DIALOG(pQuestion))) { case GTK_RESPONSE_YES: gtk_main_quit(); break; case GTK_RESPONSE_NONE: case GTK_RESPONSE_NO: gtk_widget_destroy(pQuestion); break; } } void OnAbout(GtkWidget* widget, gpointer data) { GtkWidget *pAbout; pAbout = gtk_message_dialog_new (GTK_WINDOW(data), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Cours GTK+ 2.0\n" "http://www.gtk-fr.org"); gtk_dialog_run(GTK_DIALOG(pAbout)); gtk_widget_destroy(pAbout); }