​javascript:void(0)​


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 == 3)
{
gtk_menu_popup (menu, NULL, NULL, NULL, NULL,
event_button->button, event_button->time);
return TRUE;
}
}
return FALSE;


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 -> ""

* "" -> ""

* "