GTK2..0多级菜单的实现(转自别人的实现)

GTK+多级菜单的实现

学习笔记 2009-12-16 20:20:54 阅读106 评论0   字号:   订阅

    GTK+创建菜单的方式有多种,这里采用的是手工创建菜单的方式。建立多级菜单的过程和方法与建立普通的菜单方法相同,之所以能够实现菜单的分级形式,关键就是重新建立一个菜单,然后将其添加到需要下级菜单的菜单项中。下面的代码是整理于一位网友的代码所得:

#include  <gtk/gtk.h>
 
GtkWidget* form1;
GtkWidget* box1;
GtkWidget* menubar;
GtkWidget* menuitem1;
GtkWidget* menuitem2;
GtkWidget* menuitem3;
GtkWidget* menu1;
GtkWidget* menu2;
GtkWidget* menuitem1_1;
GtkWidget* menuitem1_2;
GtkWidget* menuitem1_3;
GtkWidget* menuitem2_1;
GtkWidget* menuitem2_2;
GtkWidget* menu1_1;
GtkWidget* menuitem1_1_1;
GtkWidget* menuitem1_1_2;
void pt(GtkWidget* w, gpointer p);

int main(int argc, char *argv[])
{gtk_init(&argc,&argv);
form1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(form1), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
box1=gtk_vbox_new(FALSE,0);

//建立菜单条并把第一级菜单项放入
menubar=gtk_menu_bar_new();//建立菜单条
menuitem1=gtk_menu_item_new_with_label(" 菜单 1");//建立菜单项
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem1);//把菜单项加入到菜单条中
menuitem2=gtk_menu_item_new_with_label(" 菜单 2 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem2);
menuitem3=gtk_menu_item_new_with_label(" 菜单 3 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem3);

//建立menuitem1的子菜单
menu1=gtk_menu_new();//建立菜单
menuitem1_1=gtk_menu_item_new_with_label(" 一级菜单 1_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_1);//把菜单项加入到菜单中
menuitem1_2=gtk_menu_item_new_with_label(" 一级菜单 1_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_2);
menuitem1_3=gtk_menu_item_new_with_label(" 一级菜单 1_3 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_3);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem1),menu1);//最后把菜单menu1粘到菜单项menuitem1上

//如法炮制menuitem2的子菜单
menu2=gtk_menu_new();
menuitem2_1=gtk_menu_item_new_with_label("  一级菜单 2_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_1);
menuitem2_2=gtk_menu_item_new_with_label(" 一级菜单 2_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem2),menu2);

//创建二级子菜单,多级菜单的实现关键的地方就是 menu1_1=gtk_menu_new() 这一句创建语句,这是第一点
menu1_1=gtk_menu_new();
menuitem1_1_1=gtk_menu_item_new_with_label(" 二级菜单 1_1_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1_1),menuitem1_1_1);
menuitem1_1_2=gtk_menu_item_new_with_label(" 二级菜单 1_1_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1_1),menuitem1_1_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem1_1),menu1_1);  //将子菜单加入需要子菜单的菜单项

//连接信号和函数
gtk_signal_connect(GTK_OBJECT(menuitem1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1"));
gtk_signal_connect(GTK_OBJECT(menuitem2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2"));
gtk_signal_connect(GTK_OBJECT(menuitem3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem3"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1"));
gtk_signal_connect(GTK_OBJECT(menuitem1_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_2"));
gtk_signal_connect(GTK_OBJECT(menuitem1_3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_3"));
gtk_signal_connect(GTK_OBJECT(menuitem2_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_1"));
gtk_signal_connect(GTK_OBJECT(menuitem2_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_2"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1_1"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1_2"));

gtk_box_pack_start(GTK_BOX(box1),menubar,FALSE,FALSE,0);
gtk_container_add(GTK_CONTAINER(form1),box1);
gtk_window_set_default_size(GTK_WINDOW(form1),400,200);

gtk_widget_show_all(form1);
gtk_main();
return(0);
}

void pt(GtkWidget* w, gpointer p)
{g_print("%s/n",(gchar*)p);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值