GTK 菜单的创建详解
1 定义
1.1 菜单由菜单条和菜单项组成,它们的定义如下所示:
- 菜单项(GtkMenuItem):添加到菜单条或下拉菜单中构件
- 顶层菜单项:添加到菜单条上的菜单项称为顶层菜单项
- 下拉菜单(GtkMenu):当鼠标移动到某个菜单项后显示出来的菜单(GtkMenu)称为下拉菜单。它通常用来作为放置菜单项的容器
1.2 菜单的创建
- 创建一个菜单条
- 往菜单条上添加菜单项(顶层菜单项)
- 创建一个下拉菜单,并将该下拉菜单作为顶层菜单项的子菜单
1.3 相关函数
- ==============================================================================
菜单条操作
gtk_menu_bar_new:创建菜单条
gtk_menu_bar_append:往菜单条尾部添加菜单项
gtk_menu_bar_prepend:往菜单条首部添加菜单项
gtk_menu_bar_insert:往菜单条中指定的位置添加菜单项
============================================================================== - 菜单项操作
gtk_menu_item_new_with_label:创建带有标签的菜单项
gtk_menu_item_new:创建一个菜单分隔条(菜单分隔条实际上是不带标签的菜单项)
gtk_menu_item_set_submenu:将一个下拉菜单设置成指定菜单项的子菜单
============================================================================== - 下拉菜单操作
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 菜单的创建详解的更多相关文章
- GRUB2配置详解:默认启动项,超时时间,隐藏引导菜单,配置文件详解,图形化配置
配置文件详解: /etc/default/grub # 设定默认启动项,推荐使用数字 GRUB_DEFAULT=0 # 注释掉下面这行将会显示引导菜单 #GRUB_HIDDEN_TIMEOUT=0 # ...
- 161130、Dubbo+SpringMVC工程创建详解
Dubbo出现的目的是为了应对现在高并发,高数据量请求的问题.目前的垂直应用架构已经无法满足现在大数据的冲击,SOA就应运而生,而Dubbo在国内使用的还是比较多,稳定性也比较不错. 架构 节点角色说 ...
- Spring的bean创建详解
IoC容器,又名控制反转,全称为Inverse of Control,其是Spring最为核心的一个组件,其他的组件如AOP,Spring事务等都是直接或间接的依赖于IoC容器的.本文主 ...
- Java线程池的创建详解
本篇文章主要总结了Java创建线程池的三种方式以及线程池参数的详细说明,对线程池感兴趣的同学可以作为参考学习. 1)通过工具类java.util.concurrent.Executors的静态方法来创 ...
- 【重构】AndroidStudio中代码重构菜单Refactor功能详解
代码重构几乎是每个程序员在软件开发中必须要不断去做的事情,以此来不断提高代码的质量.Android Stido(以下简称AS)以其强大的功能,成为当下Android开发工程师最受欢迎的开发工具,也是A ...
- Spring Boot源码(六):Bean的创建详解
继续之前的项目: People加上无参构造方法: @Component public class People { // private User user; public People(){ Sys ...
- iOS-动态库创建(详解)
https://blog.csdn.net/LisztCoder/article/details/78132147 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Vue.js系列(一):Vue项目创建详解
引言 Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,并详细介绍使用vue-cli脚手架工具快速的构建Vu ...
- CSS详解
Web前端开发css基础样式总结 颜色和单位的使用 颜色 用颜色的名字表示颜色,比如:red 用16进制表示演示 比如:#FF0000 用rgb数值表示颜色,rgb(红,绿,蓝),每个值都在0-255 ...
随机推荐
- 【2017-2-19】C#数据类型,数据转换,变量,常量,转义符
数据类型 一.基本数据类型 1.值类型(不可以为null) ⑴整型(可以为负数) byle,int,short,long(从小到大排列) 常用整型 int a=值(小于10位数) long b=值(1 ...
- python练习:一行搞定-统计一句话中每个单词出现的个数
一行搞定-统计一句话中每个单词出现的个数 >>> s'i am a boy a bood boy a bad boy' 方式一:>>> dict([(i,s.spl ...
- POJ 3662 Telephone Lines (二分 + 最短路)
Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...
- USB基础知识概论(版本:v0.9.2)
源: USB基础知识概论
- nginx的gzip压缩功能
我们在开发网站的时候,应该要考虑到pv,因为pv比较大可能会造成服务器带宽不够用,进而导致用户体验变差. 这个时候我们就可以考虑用nginx的gzip功能. 在nginx中开启gzip压缩功能很简单, ...
- 关于functools模块的wraps装饰器用途
测试环境:Python3.6.2 + win10 + Pycharm2017.3 装饰器之functools模块的wraps的用途: 首先我们先写一个装饰器 # 探索functools模块wraps ...
- java读取文件和写入文件的方式
https://www.cnblogs.com/fnlingnzb-learner/p/6011324.html
- NATS—基础介绍
1. 介绍 NATS(Message bus): 从CloudFoundry的总架构图看,位于各模块中心位置的是一个叫nats的组件.NATS是由CloudFoundry的架构师Derek开发的一个开 ...
- tomcat日志警告WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did not find a matching property.
日志中有警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'debug' to '0' did ...
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 解决方法
在使用hibernate validator进行参数有效性校验的时候,我们有时候会遇到javax.validation.UnexpectedTypeException: HV000030: No va ...