研究了半天的菜单(特指主菜单),总算有些眉目了!
菜单的创建过程:
在Gtk中,菜单首先要有一个菜单条MenuBar,使用函数gtk_menu_bar_new()创建;
其次,需要在上面放一个菜单项,这个菜单项就是 最顶上的菜单,比如浏览器上的文件菜单,这个可以使用gtk_menu_item_new_with_label或 gtk_menu_item_new_with_mnemonic函数来创建,对于顶级菜单我建议使用后面这个函数创建,因为这个函数创建出来的菜单可以 带上一个快捷键,这个快捷键是软件的基本功能,例如“文件(F)”,我们按ALT+F键即可激活菜单;先在来看看怎么生成这样的菜单吧(我可是找了一个小时的时间才搞定的哦):
gtk_menu_item_new_with_mnemonic("文件(_F)");
这里还有一个小提示,看本文最后,别忘了还要把菜单项加入到菜单条中,使用gtk_menu_bar_append(GTK_MENU_BAR(菜单条), 菜单项)函数;
第三,创建菜单,使用gtk_menu_new()函数,注意:此对象不需要show,即不需要调用gtk_widget_show()函数来显示这个对象;
第四,创建下面的菜单项,可以使用gtk_menu_item_new_with_label或 gtk_menu_item_new_with_mnemonic函数,效果上面已经说过了;,然后把菜单项加入到第三步创建的菜单中,使用函数 gtk_menu_append(GTK_MENU(菜单), 菜单项);
第五,现在我们把第三步创建的菜单与顶级菜单关联起来gtk_menu_item_set_submenu(GTK_MENU_ITEM(顶级菜单), 菜单);
最后,把菜单条加入到窗口中gtk_container_add(GTK_CONTAINER(窗口), 菜单条);
很难看?自己想办法怎么布局吧,我使用BOX的;
下面再说一下快捷键:
GtkAccelGroup *accel_group;
accel_group = gtk_accel_group_new();
gtk_widget_add_accelerator(菜单项,
"activate", //信号
accel_group,
GDK_Q, // Q键
(GdkModifierType) GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
gtk_window_add_accel_group(GTK_WINDOW(win), accel_group);
记得#include <gdk/gdkkeysyms.h>。
附加内容:
关于 gtk_menu_item_new_with_mnemonic("文件(_F)") 这一句,用Glade生成的代码都定义了下面的宏
#ifdef ENABLE_NLS
# include <libintl.h>
# undef _
# define _(String) dgettext (PACKAGE, String)
#else
# define _(String) (String)
#endif
然后调用时,
gtk_menu_item_new_with_mnemonic(_("文件(_F)"));
做了一个实验,有没有他编译都不出错,也不知道这个宏是干什么用的,有牛人看到要给指点一二啊!