G0398 发表于 2014-11-10 20:32:14

C语言GUI程序设计-GTK图文系列-菜单

接收用户操作命令的部件除了按钮还有菜单和工具栏,这一讲主要讲解GTK中的菜单。
菜单这玩意看起来简单,但是在GTK中创建它还是挺繁琐的,主要是由于它们之间的关系有点复杂。{:5_99:}


这里用图解的方式来说明它们之间的关系。



如上图:
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这个函数把菜单组和主菜单项关联起来。
gtk_menu_shell_append这个函数是将子菜单项添加到菜单组里。
然后还是通过这个函数把“带头大哥”添加到菜单栏里,这样菜单的显示工作就完成了。

通过注册 activate 信号量可以获取菜单点击通知,这样就可以处理菜单发出的命令了。

这一讲就说这么多,下一讲讲解GTK中的工具栏:GtkToolBar

1012662902 发表于 2014-11-10 21:31:50

沙发~~~   谢谢LZ分享

Angel丶L 发表于 2014-11-10 21:41:24

代码好长哟、
页: [1]
查看完整版本: C语言GUI程序设计-GTK图文系列-菜单