1 定义
1.1 菜单由菜单条和菜单项组成,它们的定义如下所示:
1.2 菜单的创建
1.3 相关函数
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 -> ""
* "" -> ""
* "
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有