以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第67页的内容——检查菜单,还是使用上一个例子程序,将gtk_menu_item_new_with_label改为gtk_check_menu_item_new_with_label,所有选项前就有一个空框,这样可以实现多选,gtk_check_menu_item_set_active用来设置选项默认状态是已经勾选的
在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page67.c -o page67 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page67
/* the example on page 67 */
#include <gtk/gtk.h>
/* 准备材料,自定义函数 */
/* comments注释 */
/* 程序主体 */
int main( int argc, char *argv[] )
{
GtkWidget *window;
/* 声明变量window为构件gtkwidget */
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;
gtk_init (&argc, &argv);
/* 初始化gtk */
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);
/* 设置窗口的大小,横为500像素,竖为200像素 */
gtk_window_set_title (GTK_WINDOW (window), "菜单");
/* 为窗口顶部加上标题为菜单 */
g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
/* 为窗口加上动作,当收到destroy信号,就启动gtk_main_quit事件,gtk_main_quit就是鼠标单击窗口右上角的关闭按钮就终止程序 */
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 ("粥");
/* 创建名称粥zhou */
gtk_menu_shell_append (GTK_MENU_SHELL(menubar), zhou);
/* 将名称粥zhou加入菜单条menubar */
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 ();
/* 类似创建菜单条,菜单条可以理解为一级菜单或者叫根菜单, */
/* 创建粥菜单zhoumenu,粥菜单是二级菜单或者叫做次级菜单, */
/* 接下的粉菜单fenmenu、面菜单、饭菜单都是二级菜单, */
/* 粥菜单有6个名称:粥zhou、白粥zhou1、猪红粥zhou2、 */
/* 八宝粥zhou3、艇仔粥zhou4、皮蛋瘦肉粥zhou5, */
/* 第一名称粥zhou已经在一级菜单就已经被创建了, */
/* 在二级菜单就是重复利用第二次,粥zhou作为封面要用 */
/* gtk_menu_item_set_submenu函数加入粥菜单zhoumenu */
gtk_menu_item_set_submenu (GTK_MENU_ITEM (zhou), zhoumenu);
zhou1 = gtk_check_menu_item_new_with_label ("白粥");
/* 创建名称白粥zhou1 */
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zhou1), TRUE);
/* 设置白粥zhou1的默认状态是已经勾选了 */
gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou1);
/* 将名称白粥zhou1加入二级菜单粥菜单zhoumenu */
zhou2 = gtk_check_menu_item_new_with_label ("猪红粥");
gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou2);
zhou3 = gtk_check_menu_item_new_with_label ("八宝粥");
gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou3);
zhou4 = gtk_check_menu_item_new_with_label ("艇仔粥");
gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou4);
zhou5 = gtk_check_menu_item_new_with_label ("皮蛋瘦肉粥");
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_check_menu_item_new_with_label ("螺蛳粉");
gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen1);
fen2 = gtk_check_menu_item_new_with_label ("桂林米粉");
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (fen2), TRUE);
/* 设置桂林米粉fen2的默认状态是已经勾选了 */
gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen2);
fen3 = gtk_check_menu_item_new_with_label ("肠粉");
gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen3);
fen4 = gtk_check_menu_item_new_with_label ("汤粉");
gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen4);
fen5 = gtk_check_menu_item_new_with_label ("炒粉");
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_check_menu_item_new_with_label ("牛腩面");
gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian1);
mian2 = gtk_check_menu_item_new_with_label ("兰州拉面");
gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian2);
mian3 = gtk_check_menu_item_new_with_label ("捞面");
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mian3), TRUE);
gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian3);
mian4 = gtk_check_menu_item_new_with_label ("竹升面");
gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian4);
mian5 = gtk_check_menu_item_new_with_label ("刀削面");
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_check_menu_item_new_with_label ("叉烧饭");
gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan1);
fan2 = gtk_check_menu_item_new_with_label ("扬州炒饭");
gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan2);
fan3 = gtk_check_menu_item_new_with_label ("煲仔饭");
gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan3);
fan4 = gtk_check_menu_item_new_with_label ("蒸饭");
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (fan4), TRUE);
gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan4);
fan5 = gtk_check_menu_item_new_with_label ("竹筒饭");
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_check_menu_item_new_with_label ("云吞");
gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita1);
qita2 = gtk_check_menu_item_new_with_label ("萝卜糕");
gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita2);
qita3 = gtk_check_menu_item_new_with_label ("粽");
gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita3);
qita4 = gtk_check_menu_item_new_with_label ("油炸鬼");
gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita4);
qita5 = gtk_check_menu_item_new_with_label ("蛋塔");
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (qita5), TRUE);
gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita5);
gtk_widget_show_all (window);
/* 显示构件窗口 */
gtk_main ();
/* 进入主循环,等待信号(鼠标键盘)输入 */
return 0;
}
效果图如下