1 定义

1.1 菜单由菜单条和菜单项组成,它们的定义如下所示:

  1. 菜单项(GtkMenuItem):添加到菜单条或下拉菜单中构件
  2. 顶层菜单项:添加到菜单条上的菜单项称为顶层菜单项
  3. 下拉菜单(GtkMenu):当鼠标移动到某个菜单项后显示出来的菜单(GtkMenu)称为下拉菜单。它通常用来作为放置菜单项的容器

1.2 菜单的创建

  1. 创建一个菜单条
  2. 往菜单条上添加菜单项(顶层菜单项)
  3. 创建一个下拉菜单,并将该下拉菜单作为顶层菜单项的子菜单

1.3 相关函数

  1. ==============================================================================
    菜单条操作
    gtk_menu_bar_new:创建菜单条
    gtk_menu_bar_append:往菜单条尾部添加菜单项
    gtk_menu_bar_prepend:往菜单条首部添加菜单项
    gtk_menu_bar_insert:往菜单条中指定的位置添加菜单项
    ==============================================================================
  2. 菜单项操作
    gtk_menu_item_new_with_label:创建带有标签的菜单项
    gtk_menu_item_new:创建一个菜单分隔条(菜单分隔条实际上是不带标签的菜单项)
    gtk_menu_item_set_submenu:将一个下拉菜单设置成指定菜单项的子菜单
    ==============================================================================
  3. 下拉菜单操作
    gtk_menu_new:创建下拉菜单
    gtk_menu_append:往下拉菜单尾部添加菜单项
    gtk_menu_prepend:往下拉菜单首部添加菜单项
    gtk_menu_insert:往下拉菜单中指定的位置添加菜单项

2 菜单的使用

==============================================================================
创建菜单条

GtkWidget *menubar,*menu,*menuitem
menubar=gtk_menu_bar_new();

==============================================================================
往菜单条中添加顶层菜单

menuitem=gtk_menu_item_new_with_label("文件");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem);
gtk_widget_show(menuitem);

==============================================================================
创建下拉菜单,并将其作为某个顶层菜单项的子菜单

menu=gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu);

==============================================================================
往下拉菜单中添加菜单项

menuitem=gtk_menu_item_new_with_label("新建...");
gtk_menu_append(GTK_MENU(menu),menuitem);

==============================================================================
菜单项信号处理

g_signal_connect(GTK_MENU_ITEM(menuitem),"activate",G_CALLBACK(event_handle),"new");

注意:
     1. activate:当用户单击菜单项是产生的信号
     2. 当所有菜单项的回调函数都相同时,我们可以通过分析往回调函数传递的用户数据来判断到底用户选择的是哪个按钮(因为不同构件在注册某个信号时可以传递各自的用户数据)
==============================================================================

3 弹出式菜单

==============================================================================
用来显示弹出式菜单的回调函数的注册

g_signal_connect_swapped (window, "button_press_event", G_CALLBACK (my_popup_handler), menu);

==============================================================================
显示弹出式菜单的回调函数

static gint
my_popup_handler (GtkWidget *widget, GdkEvent *event)
{
GtkMenu *menu;
GdkEventButton *event_button; g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_MENU (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE); menu = GTK_MENU (widget); if (event->type == GDK_BUTTON_PRESS)
{
event_button = (GdkEventButton *) event;
if (event_button->button == )
{
gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
event_button->button, event_button->time);
return TRUE;
}
}
return FALSE;
.使用GtkItemFactory来创建菜单

============================================================================
创建一个静态的GtkItemFactoryEntry类型的结构体数组,用来描述所要创建的菜单
static GtkItemFactoryEntry menu_items[]={
{"/File",NULL,NULL,,""},
{"/File/_New","N",event_handle,"New",NULL},
{"/File/",NULL,NULL,,""},
{"/File/_Exit","E",quit_application,"Exit",NULL}
};
============================================================================
创建一个快捷键组,并将它与某个窗口关联
GtkAccelGroup* accel_group=gtk_accel_group_new();
gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); ============================================================================
创建一个GtkItemFactory,并指定一个快捷键组,用来保存菜单项所对应的快捷键
GtkItemFactory* item_factory=gtk_item_factory_new(GTK_TYPE_MENU_BAR,"
",accel_group); ============================================================================
使用GtkItemFactoryEntry数组来创建菜单
nmenu_items=sizeof(menu_items)/sizeof(menu_items[]);
gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL);
menubar=gtk_item_factory_get_widget(item_factory,"
");
============================================================================ .GtkItemFactoryEntry结构 =================================================================================
typedef struct {
gchar *path; 菜单项的路径
gchar *accelerator; 菜单项对应的快捷键
GtkItemFactoryCallback callback; 回调函数
guint callback_action; 传递给回调函数的gpointer参数 gchar *item_type;
/* item_type的可能取值:
* NULL -> ""
* "" -> ""
* "

转载来自:http://blog.chinaunix.net/uid-25547034-id-3027877.html

GTK 菜单的创建详解的更多相关文章

  1. GRUB2配置详解:默认启动项,超时时间,隐藏引导菜单,配置文件详解,图形化配置

    配置文件详解: /etc/default/grub # 设定默认启动项,推荐使用数字 GRUB_DEFAULT=0 # 注释掉下面这行将会显示引导菜单 #GRUB_HIDDEN_TIMEOUT=0 # ...

  2. 161130、Dubbo+SpringMVC工程创建详解

    Dubbo出现的目的是为了应对现在高并发,高数据量请求的问题.目前的垂直应用架构已经无法满足现在大数据的冲击,SOA就应运而生,而Dubbo在国内使用的还是比较多,稳定性也比较不错. 架构 节点角色说 ...

  3. Spring的bean创建详解

           IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的.本文主 ...

  4. Java线程池的创建详解

    本篇文章主要总结了Java创建线程池的三种方式以及线程池参数的详细说明,对线程池感兴趣的同学可以作为参考学习. 1)通过工具类java.util.concurrent.Executors的静态方法来创 ...

  5. 【重构】AndroidStudio中代码重构菜单Refactor功能详解

    代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...

  6. Spring Boot源码(六):Bean的创建详解

    继续之前的项目: People加上无参构造方法: @Component public class People { // private User user; public People(){ Sys ...

  7. iOS-动态库创建(详解)

    https://blog.csdn.net/LisztCoder/article/details/78132147 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  8. Vue.js系列(一):Vue项目创建详解

    引言 Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,并详细介绍使用vue-cli脚手架工具快速的构建Vu ...

  9. CSS详解

    Web前端开发css基础样式总结 颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-255 ...

随机推荐

  1. 重装win10系统

    一. 1.搜索是最好的老师,这个是非常重要的 2.数据的二备份,和三备份 二. 待完善

  2. linux文件系统的用户和权限管理

    1. 为什么要有用户的概念? 多用户,多任务业务对系统资源的隔离产生需求 2. linux 用户的分类? 2.1. 管理员 拥有操作所有文件的权限 2.2. 普通用户 2.2.1. 普通登录用户 2. ...

  3. linux yum配置本地iso镜像

    1.本地源配置:cdiso.repo 将iso镜像文件中所有内容复制到/public/software/cdrom 中,节点将本地yum指向此处. [root@node19 ~]# vim /etc/ ...

  4. POJ 3624 Charm Bracelet (01背包)

    题目链接:http://poj.org/problem?id=3624 Bessie has gone to the mall's jewelry store and spies a charm br ...

  5. Hadoop学习笔记之二:NameNode

    NameNode对三大协议接口(NamenodeProtocol.ClientProtoco.DatanodeProtocol)进行实现,利用ipc::Server通过三个协议分别向SNN.Clien ...

  6. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...

  7. shell 获取随机字符串

    一直使用 /dev/urandom 和md5sum的方式去随机字符串,感觉还是不够随机,毕竟只有小写字母和数字嘛. 换换口味: [root@localhost ~]# arr=(`echo {a..z ...

  8. API网关性能比较:NGINX vs. ZUUL vs. Spring Cloud Gateway vs. Linkerd(转)

    前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay Çelik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx 作 ...

  9. easyui以及js前端开发常见问题、用法整理(最重要的样式和图标自定义)

    自定义图标 iconCls 所有属性值枚举: icon-add icon-print icon-mini-add icon-cvs icon-play icon-refresh icon-edit i ...

  10. windows下rabbitmq-c编译(带openssl、无需MinGW)

    因为项目原因,需要使用到rabbitmq的c客户端库.首先,参见上一篇windows下openssl编译,如果已经使用cmake编译过了,则先delete cache(File-Delete Cach ...