前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GTK 菜单的创建详解

GTK 菜单的创建详解

作者头像
RainMark
发布2019-09-10 19:38:04
1.4K0
发布2019-09-10 19:38:04
举报
文章被收录于专栏:RainMark 的文章RainMark 的文章

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 菜单的使用

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

代码语言:javascript
复制
GtkWidget *menubar,*menu,*menuitem
menubar=gtk_menu_bar_new();

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

代码语言:javascript
复制
menuitem=gtk_menu_item_new_with_label("文件");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem);
gtk_widget_show(menuitem);

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

代码语言:javascript
复制
menu=gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu);

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

代码语言:javascript
复制
menuitem=gtk_menu_item_new_with_label("新建...");
gtk_menu_append(GTK_MENU(menu),menuitem);

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

代码语言:javascript
复制
g_signal_connect(GTK_MENU_ITEM(menuitem),"activate",G_CALLBACK(event_handle),"new");

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

3 弹出式菜单

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

代码语言:javascript
复制
g_signal_connect_swapped (window, "button_press_event", G_CALLBACK (my_popup_handler), menu);

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

代码语言:javascript
复制
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 == 3)
      {
         gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
         event_button->button, event_button->time);
         return TRUE;
      }
   }
   return FALSE;
代码语言:javascript
复制
5.使用GtkItemFactory来创建菜单


============================================================================
创建一个静态的GtkItemFactoryEntry类型的结构体数组,用来描述所要创建的菜单
static GtkItemFactoryEntry menu_items[]={
{"/File",NULL,NULL,0,""},
{"/File/_New","N",event_handle,"New",NULL},
{"/File/",NULL,NULL,0,""},
{"/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[0]);
gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL);
menubar=gtk_item_factory_get_widget(item_factory,"
");
============================================================================

6.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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档