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. mongoDB启动前的系统设置,解决部分Warning问题

    1.多核心系统资源分配问题 2017-10-13T17:57:02.650+0800 I CONTROL [initandlisten] ** WARNING: You are running on ...

  2. Jmeter压力测试和接口测试

    jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ...

  3. 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK

    如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...

  4. win10 校园宽带连接不上的解决办法(错误720、“以太网”没有有效的ip设置)

    遇到的问题如下图所示: 插上宽带后,查看以太网状态显示如下: 创建新连接宽带(PPPoE)(R)后,连接失败,错误为720,显示如下: 以太网网络诊断后,结果显示“以太网”没有有效的Ip设置,如下图所 ...

  5. 前端框架VUE----babel

    这个是解析我们es6的代码的,为什么要用它呢,因为对于一些ie浏览器,甚至FF浏览器,低版本的还不能识别我们的es6代码,那么vue里面好多还让我们去写es6的代码,这个时候我们就可以用babel这个 ...

  6. 前端框架VUE----学习vue前的准备工作

    起步 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不推荐上来就直接 ...

  7. 每日linux命令学习-lsattr和chattr

    lsattr和chattr命令 1. lsattr命令 作用: 显示文件属性 语法: lsattr [-adlRvV][files...] 参数: -a 显示所有文件和目录(包括隐藏文件)的属性. - ...

  8. 新增async

    import asyncio from threading import Thread import time now = lambda: time.time() print('start',now( ...

  9. Prometheus监控学习笔记之PromQL简单示例

    0x00 简单的时间序列选择 返回度量指标 http_requests_total 的所有时间序列样本数据: http_requests_total 返回度量指标名称为 http_requests_t ...

  10. oracle RAC如何正确地删除ASM磁盘组

    1.登录到命令行 切换到grid用户 [grid@swnode1 ~]$ sqlplus / as sysasm SQL*Plus: Release Production on Wed May :: ...