以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第68页的内容——检查菜单,还是使用上一个例子程序,将gtk_menu_item_new_with_label改为gtk_radio_menu_item_new_with_label,与第53页的选择按钮gtk_radio_button一样思路,将多个选项加入一个组group,才能实现多选一的功能,group的初始值为NULL,之后将第一个选项变成group的值,再之后剩下的选项的group值设置为第一选项group值,而gtk3-demo中的Menus例子程序是使用函数gtk_radio_menu_item_with_label_from_widget(NULL, 第一选项);
gtk_radio_menu_item_join_group(GTK_RADIO_MENU_ITEM(第一选项), 第N选项);
将第N选项的group值加入第一选项的group值,比较简化,难以一下子理解
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zhou1), TRUE); 用来设置选项默认状态是已经点选的,没有gtk_radio_menu_item_set_active函数,注意前有小写check后面也有大写CHECK
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page68.c -o page68 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page68
#includeint main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *vbox; GtkWidget *menubar; GtkWidget *zhou; GtkWidget *fen; GtkWidget *mian; GtkWidget *fan; GtkWidget *qita; GtkWidget *zhoumenu; GtkWidget *zhou1; GtkWidget *zhou2; GtkWidget *zhou3; GtkWidget *zhou4; GtkWidget *zhou5; GtkWidget *fenmenu; GtkWidget *fen1; GtkWidget *fen2; GtkWidget *fen3; GtkWidget *fen4; GtkWidget *fen5; GtkWidget *mianmenu; GtkWidget *mian1; GtkWidget *mian2; GtkWidget *mian3; GtkWidget *mian4; GtkWidget *mian5; GtkWidget *fanmenu; GtkWidget *fan1; GtkWidget *fan2; GtkWidget *fan3; GtkWidget *fan4; GtkWidget *fan5; GtkWidget *qitamenu; GtkWidget *qita1; GtkWidget *qita2; GtkWidget *qita3; GtkWidget *qita4; GtkWidget *qita5; GSList *groupzhou = NULL; GSList *groupfen = NULL; GSList *groupmian = NULL; GSList *groupfan = NULL; GSList *groupqita = NULL; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 500, 200); gtk_window_set_title (GTK_WINDOW (window), "菜单"); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (window), vbox); menubar = gtk_menu_bar_new (); gtk_box_pack_start (GTK_BOX (vbox), menubar, FALSE, TRUE, 0); zhou = gtk_menu_item_new_with_label ("粥"); gtk_menu_shell_append (GTK_MENU_SHELL(menubar), zhou); fen = gtk_menu_item_new_with_label ("粉"); gtk_menu_shell_append (GTK_MENU_SHELL(menubar), fen); mian = gtk_menu_item_new_with_label ("面"); gtk_menu_shell_append (GTK_MENU_SHELL(menubar), mian); fan = gtk_menu_item_new_with_label ("饭"); gtk_menu_shell_append (GTK_MENU_SHELL(menubar), fan); qita = gtk_menu_item_new_with_label ("其它"); gtk_menu_shell_append (GTK_MENU_SHELL(menubar), qita); zhoumenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (zhou), zhoumenu); zhou1 = gtk_radio_menu_item_new_with_label (groupzhou,"白粥"); groupzhou = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (zhou1)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zhou1), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou1); zhou2 = gtk_radio_menu_item_new_with_label (groupzhou,"猪红粥"); groupzhou = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (zhou1)); gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou2); zhou3 = gtk_radio_menu_item_new_with_label (groupzhou,"八宝粥"); groupzhou = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (zhou1)); gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou3); zhou4 = gtk_radio_menu_item_new_with_label (groupzhou,"艇仔粥"); groupzhou = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (zhou1)); gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou4); zhou5 = gtk_radio_menu_item_new_with_label (groupzhou,"皮蛋瘦肉粥"); groupzhou = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (zhou1)); gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou5); fenmenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (fen), fenmenu); fen1 = gtk_radio_menu_item_new_with_label (groupfen, "螺蛳粉"); groupfen = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fen1)); gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen1); fen2 = gtk_radio_menu_item_new_with_label (groupfen, "桂林米粉"); groupfen = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fen1)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (fen2), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen2); fen3 = gtk_radio_menu_item_new_with_label (groupfen, "肠粉"); groupfen = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fen1)); gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen3); fen4 = gtk_radio_menu_item_new_with_label (groupfen, "汤粉"); groupfen = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fen1)); gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen4); fen5 = gtk_radio_menu_item_new_with_label (groupfen, "炒粉"); groupfen = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fen1)); gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen5); mianmenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (mian), mianmenu); mian1 = gtk_radio_menu_item_new_with_label (groupmian, "牛腩面"); groupmian = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mian1)); gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian1); mian2 = gtk_radio_menu_item_new_with_label (groupmian, "兰州拉面"); groupmian = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mian1)); gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian2); mian3 = gtk_radio_menu_item_new_with_label (groupmian, "捞面"); groupmian = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mian1)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mian3), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian3); mian4 = gtk_radio_menu_item_new_with_label (groupmian, "竹升面"); groupmian = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mian1)); gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian4); mian5 = gtk_radio_menu_item_new_with_label (groupmian, "刀削面"); groupmian = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (mian1)); gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian5); fanmenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (fan), fanmenu); fan1 = gtk_radio_menu_item_new_with_label (groupfan, "叉烧饭"); groupfan = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fan1)); gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan1); fan2 = gtk_radio_menu_item_new_with_label (groupfan, "扬州炒饭"); groupfan = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fan1)); gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan2); fan3 = gtk_radio_menu_item_new_with_label (groupfan, "煲仔饭"); groupfan = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fan1)); gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan3); fan4 = gtk_radio_menu_item_new_with_label (groupfan, "蒸饭"); groupfan = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fan1)); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (fan4), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan4); fan5 = gtk_radio_menu_item_new_with_label (groupfan, "竹筒饭"); groupfan = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (fan1)); gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan5); qitamenu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (qita), qitamenu); qita1 = gtk_radio_menu_item_new_with_label (groupqita, "云吞"); groupqita = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (qita1)); gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita1); qita2 = gtk_radio_menu_item_new_with_label (groupqita, "萝卜糕"); groupqita = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (qita1)); gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita2); qita3 = gtk_radio_menu_item_new_with_label (groupqita, "粽"); groupqita = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (qita1)); gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita3); qita4 = gtk_radio_menu_item_new_with_label (groupqita, "油炸鬼"); groupqita = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (qita1)); gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita4); qita5 = gtk_radio_menu_item_new_with_label (groupqita, "蛋塔"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (qita5), TRUE); groupqita = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (qita1)); gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita5); gtk_widget_show_all (window); gtk_main (); return 0; }
效果图如下



