主要是参考《GTK+:“菜单” (menubar)和“工具栏”(toolbars)》
https://www.cnblogs.com/hotsummer/archive/2011/03/01/1967731.html
例子中的vbox = gtk_vbox_new(FALSE, 0);是属于gtk+2.0的,要改为vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);才能在gtk+3.0编译通过,原作者的讲解是比较容易理解,在此要感谢原作者

以下gtk+编程例子是来自书籍《实用技术:开发Linux应用——用GTK+和GDK开发Linux图形用户界面应用》第62页的内容——菜单,结合自己的理解,写了一个简单的小程序

粥 粉 面 饭 其它
白粥 螺蛳粉 牛腩面 叉烧饭 云吞
猪红粥 桂林米粉 兰州拉面 扬州炒饭 萝卜糕
八宝粥 肠粉 捞面 煲仔饭 粽
艇仔粥 汤粉 竹升面 蒸饭 油炸鬼
皮蛋瘦肉粥 炒粉 刀削面 竹筒饭 蛋塔

在openSUSE-Leap-15.3-DVD-x86_64的gnome3.34.7桌面环境下编译的,其中pkg-config --cflags --libs gtk±3.0两边有反引号括起来的
ruhong@localhost:~/gtk> gcc page62.c -o page62 pkg-config --cflags --libs gtk±3.0
ruhong@localhost:~/gtk> ./page62

/* the example on page 62 */#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_menu_item_new_with_label ("白粥");/*  创建名称白粥zhou1  */gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou1);/*  将名称白粥zhou1加入二级菜单粥菜单zhoumenu  */zhou2 = gtk_menu_item_new_with_label ("猪红粥");gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou2);zhou3 = gtk_menu_item_new_with_label ("八宝粥");gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou3);zhou4 = gtk_menu_item_new_with_label ("艇仔粥");gtk_menu_shell_append (GTK_MENU_SHELL (zhoumenu), zhou4);zhou5 = gtk_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_menu_item_new_with_label ("螺蛳粉");gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen1);fen2 = gtk_menu_item_new_with_label ("桂林米粉");gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen2);fen3 = gtk_menu_item_new_with_label ("肠粉");gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen3);fen4 = gtk_menu_item_new_with_label ("汤粉");gtk_menu_shell_append (GTK_MENU_SHELL (fenmenu), fen4);fen5 = gtk_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_menu_item_new_with_label ("牛腩面");gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian1);mian2 = gtk_menu_item_new_with_label ("兰州拉面");gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian2);mian3 = gtk_menu_item_new_with_label ("捞面");gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian3);mian4 = gtk_menu_item_new_with_label ("竹升面");gtk_menu_shell_append (GTK_MENU_SHELL (mianmenu), mian4);mian5 = gtk_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_menu_item_new_with_label ("叉烧饭");gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan1);fan2 = gtk_menu_item_new_with_label ("扬州炒饭");gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan2);fan3 = gtk_menu_item_new_with_label ("煲仔饭");gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan3);fan4 = gtk_menu_item_new_with_label ("蒸饭");gtk_menu_shell_append (GTK_MENU_SHELL (fanmenu), fan4);fan5 = gtk_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_menu_item_new_with_label ("云吞");gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita1);qita2 = gtk_menu_item_new_with_label ("萝卜糕");gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita2);qita3 = gtk_menu_item_new_with_label ("粽");gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita3);qita4 = gtk_menu_item_new_with_label ("油炸鬼");gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita4);qita5 = gtk_menu_item_new_with_label ("蛋塔");gtk_menu_shell_append (GTK_MENU_SHELL (qitamenu), qita5);gtk_widget_show_all (window);/*  显示构件窗口  */gtk_main ();/*  进入主循环,等待信号(鼠标键盘)输入  */return 0;
}

效果图如下

《GTK+:“菜单” (menubar)和“工具栏”(toolbars)》
https://www.cnblogs.com/hotsummer/archive/2011/03/01/1967731.html
例子中的vbox = gtk_vbox_new(FALSE, 0);是属于gtk+2.0的,要改为vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);才能在gtk+3.0编译通过,原作者的讲解是比较容易理解,在此要感谢原作者,重新排版如下:

/*
GTK+:“菜单” (menubar)和“工具栏”(toolbars)
https://www.cnblogs.com/hotsummer/archive/2011/03/01/1967731.html
*/
#include <gtk/gtk.h>
int main( int argc, char *argv[])
{GtkWidget *window;
GtkWidget *vbox;
GtkWidget *menubar;
GtkWidget *filemenu;
GtkWidget *file;
GtkWidget *quit;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), 250, 200);
gtk_window_set_title(GTK_WINDOW(window), "menu");
g_signal_connect_swapped(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, FALSE, 3);
file = gtk_menu_item_new_with_label("File");
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file);filemenu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file), filemenu);
quit = gtk_menu_item_new_with_label("Quit");
gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), quit);
g_signal_connect(G_OBJECT(quit), "activate", G_CALLBACK(gtk_main_quit), NULL);gtk_widget_show_all(window);
gtk_main();
return 0;
}

第62页的gtk+编程例子——菜单相关推荐

  1. 第77页的gtk+编程例子——像元图

    以下gtk+编程例子是来自书籍<实用技术:开发Linux应用--用GTK+和GDK开发Linux图形用户界面应用>第77页的内容--像元图 书中的 GtkPixmap 自从gtk+2.0 ...

  2. 第69页的gtk+编程例子——工具提示

    以下gtk+编程例子是来自书籍<实用技术:开发Linux应用--用GTK+和GDK开发Linux图形用户界面应用>第69页的内容--工具提示,当鼠标停留在某个构件上几秒就会出现文字提示,书 ...

  3. GTK+编程入门(2)—GTK+程序结构

    GTK+编程入门(2)-GTK+程序结构(2015-7-23) 分类:GTK+   现在是晚上,快到睡觉时间了.把这小节完整看完是不可能了,索性就先开个头.这节的内容是通过一个最简单的GTK+程序的分 ...

  4. LeCun的62页新作:未来十年的AI研究计划——自主机器智能

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 丰色 发自 凹非寺 转载自:量子位(QbitAI) 这段时间,关于 ...

  5. 解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法...

    在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出 ...

  6. linux raw socket 例子,raw socket编程例子

    raw socket编程例子内容安排: 1.原始套接字介绍 1.1 原始套接字工作原理与规则 1.2 简单应用 2 FTP密码窃取器实现(简单的rootkit) 2.1 设计思路 2.2 实现 2.3 ...

  7. VIM打造GTK编程环境

    2019独角兽企业重金招聘Python工程师标准>>> VIM打造GTK编程环境 概要 本文主要介绍了使用VIM的GTK和C/C++的智能提示,GTK和C/C++同时语法高亮, C/ ...

  8. python的函数式编程实例_函数式编程例子

    函数式编程例子 [篇一:函数式编程例子] 在 08 年的时候 ( 这经历记忆犹新 ) 我也跟 lz 一样,翻了好多文章, google 了好几个星期,最后我知道它 是这么个东西: ul li 它是函数 ...

  9. 使用C语言gtk编程一个贪吃蛇游戏设计与实现

    使用C语言以及gtk编程设计一个贪吃蛇游戏. 功能需求: (1)窗口界面设计:创建各种窗口和按钮标签等: (2)小蛇移动控制:按键盘上的上下左右键控制小蛇上下左右移动: (3)游戏进程控制:若小蛇碰到 ...

  10. GTK+编程入门(1)—简介与glib库

    GTK+编程入门(1)-简介与glib库(2015-7-23) 分类:GTK+ 一:GTK+简介   GTK+是一个软件开发工具包,其设计目的是支持在 X Window系统下开发图形界面的应用程序.G ...

最新文章

  1. 小蠓虫如何灭_怎么杀蠓虫
  2. dft变换的两幅图_快速傅里叶变换FFT计算方法 原理及公式
  3. 《高性能JavaScript》第四章 算法和流程控制
  4. 硬核图解!断网了,还能ping通 127.0.0.1 吗?为什么?
  5. Ext grid 根据行号获取行数据
  6. 程序员面试金典 - 面试题 16.21. 交换和(哈希set)
  7. 05-IntelliJ IDEA清空项目缓存
  8. Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
  9. Rushcrm:CRM系统中的进销存管理
  10. 水文方面数据产品总结1
  11. 高清晰卫星图片:东京、法兰克福机场、华盛顿机场、金字塔、凯旋门
  12. 自媒体入门如何制作出优质视频,有这5款软件就够了
  13. 机器学习——下采样(under-sampling)
  14. 爆锤数据结构(期末复习笔记)
  15. Oliver的救援(广搜练习题)
  16. 中国首台超级计算机“天河一号,中国首台千万亿次超级计算机天河一号安装完毕...
  17. 人工智能换脸pythonapp_如何用小200行Python代码做一个换脸程序?
  18. linux磁盘sda1变化,linux系统中sda变成sdb了怎么办
  19. 深度学习~模糊神经网络(FNN)
  20. IOS 图标尺寸以及设备尺寸详解

热门文章

  1. 拒绝从网络访问这台计算机 注册表,拒绝访问的解决方法
  2. 中英文字符的映射(TRANSLATE函数的运用)
  3. MTK6577+Android之音频(audio)移植
  4. java获取每月最后一天
  5. oracle revoke 列_oracle受权与回收权限grant和revoke
  6. css字体超出显示点点点
  7. My Thirty-fifth Page - 最大二叉树 - By Nicolas
  8. My Eighty-first Page - 打家劫舍 - By Nicolas
  9. 万网域名修改 DNS 方法
  10. 「macOS」“邮件”添加账户指南