马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
接收用户操作命令的部件除了按钮还有菜单和工具栏,这一讲主要讲解GTK中的菜单。
菜单这玩意看起来简单,但是在GTK中创建它还是挺繁琐的,主要是由于它们之间的关系有点复杂。
这里用图解的方式来说明它们之间的关系。
如上图:
1 、(粉色框中的那一栏)代表菜单栏(GtkMenuBar),所有的菜单组都放在这个菜单栏中。
2 、(黄色框中的弹出层)代表菜单组(GtkMenu),和一个主菜单项关联,包若干子菜单项。
3、(紫色框中的那一项)主菜单项(GtkMenuItem),是每一组菜单的“带头大哥”。
4、(黑色框中的那一项)子菜单项(GtkMenuItem),在一个菜单组中可以有多个子菜单项,例如上图中的(About,Tips和Plugins三项)。
这样一解释,它们之间的关系就清晰明了了。
下面是一个完整的例子:
可以看到这个窗口中的菜单位置似乎有些跑偏(废话),主要是因为在这个窗口中只有一个GtkMenuBar部件,它会自动拉伸,铺满父容器。
这是我们就要加以限制了,不能让它胡作非为,可以通过把它放到其它的布局容器中来控制整个菜单栏的布局。
这是加了GtkBox容器后的效果,示例代码如下:#include <gtk/gtk.h>
void menu_open(GtkMenuItem *menuitem, gpointer data)
{
g_print("open \n");
}
int main(int argc,char *argv[])
{
GtkWidget *window,*box;
GtkWidget *menu_bar;
GtkWidget *file_menu,*edit_menu;
GtkWidget *file_menu_item,*edit_menu_item;
GtkWidget *open_menu_item,*close_menu_item,*copy_menu_item;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect(window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_window_set_title(GTK_WINDOW(window), "hello fishc - GtkMenu");
gtk_widget_set_size_request(GTK_WIDGET(window),600,400);
box= gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
file_menu = gtk_menu_new();
edit_menu = gtk_menu_new();
menu_bar = gtk_menu_bar_new();
file_menu_item = gtk_menu_item_new_with_label("File");
edit_menu_item = gtk_menu_item_new_with_label("Edit");
open_menu_item = gtk_menu_item_new_with_label("Open");
close_menu_item = gtk_menu_item_new_with_label("Close");
copy_menu_item = gtk_menu_item_new_with_label("Copy");
g_signal_connect(GTK_WIDGET(open_menu_item), "activate", G_CALLBACK(menu_open), NULL);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_menu_item), file_menu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(edit_menu_item), edit_menu);
gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), open_menu_item);
gtk_menu_shell_append (GTK_MENU_SHELL (file_menu), close_menu_item);
gtk_menu_shell_append (GTK_MENU_SHELL (edit_menu), copy_menu_item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), file_menu_item);
gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), edit_menu_item);
gtk_box_pack_start(GTK_BOX(box), menu_bar,FALSE,FALSE,0);
gtk_container_add(GTK_CONTAINER(window), box);
gtk_widget_show_all(window);
gtk_main ();
return 0;
}
新建了GtkMenuBar,GtkMenu,GtkMenuItem这一系列菜单部件,然后通过设置它们之前的关系进行关联。gtk_menu_item_set_submenu
这个函数把菜单组和主菜单项关联起来。这个函数是将子菜单项添加到菜单组里。
然后还是通过这个函数把“带头大哥”添加到菜单栏里,这样菜单的显示工作就完成了。
通过注册 activate 信号量可以获取菜单点击通知,这样就可以处理菜单发出的命令了。
这一讲就说这么多,下一讲讲解GTK中的工具栏:GtkToolBar
|