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. flask 文件上传(单文件上传、多文件上传)

    文件上传 在HTML中,渲染一个文件上传字段只需要将<input>标签的type属性设为file,即<input type=”file”>. 这会在浏览器中渲染成一个文件上传字 ...

  2. Linux基础命令---杀死进程pkill

    pkill pkill可以给指定的进程发送信息,它可以结束某个执行的进程或者目录登录的用户. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedo ...

  3. django 集合

    1,前言 socket 位于应用层和传输层之间的一个抽象层,它是一个接口. 百度的服务器(socket服务端) . 启动socket . 绑定ip和端口 . 监听 . 接收数据 . 发送数据 . 断开 ...

  4. [转载]Javascript:history.go()和history.back()的用法和区别

    Javascript:history.go()和history.back()的用法和区别 简单的说就是:go(-1): 返回上一页,原页面表单中的内容会丢失:back(): 返回上一页,原页表表单中的 ...

  5. Django后端项目---- Rest Framework(2)

    一.认证(补充的一个点) 认证请求头 #!/usr/bin/env python # -*- coding:utf-8 -*- from rest_framework.views import API ...

  6. codeSourcery交叉编译环境

    arm-none-Linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括 ...

  7. 利用crontab定时备份nginx访问日志(也可以说是定时切分日志)

    在我们的工作中,肯定会涉及到分析访问日志. 但是如果访问日志都集中存在于一个文件中,那数据量就太大了,并且也不利于我们进行分析. 所以我们需要对访问日志进行按时间切割. 思路: 我们可以利用linux ...

  8. mysql 查询重复值

     SELECT `code`,count(`code`) as count   FROM `yt_coupon`   GROUP BY `code` HAVING count(`code`) > ...

  9. LSTM算法原理理解

    神经网络 模拟人类大脑神经网络结构,每个神经元和其他的神经元相互连接,当它兴奋的时候会向相连的神经元发送化学物质,从而改变神经元的电位,当神经元的电位超过阈值,它会被激活,向其他神经元发送化学物质.其 ...

  10. csrf_token(跨站伪造)

     Django跨站请求伪造 跨站请求伪造(Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSR ...