鱼C论坛

 找回密码
 立即注册
查看: 2664|回复: 2

[技术交流] C语言GUI程序设计-GTK图文系列-菜单

[复制链接]
发表于 2014-11-10 20:32:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


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


如上图:
1 、(粉色框中的那一栏)代表菜单栏(GtkMenuBar),所有的菜单组都放在这个菜单栏中。
2 、(黄色框中的弹出层)代表菜单组(GtkMenu),和一个主菜单项关联,包若干子菜单项。
3、(紫色框中的那一项)主菜单项(GtkMenuItem),是每一组菜单的“带头大哥”。
4、(黑色框中的那一项)子菜单项(GtkMenuItem),在一个菜单组中可以有多个子菜单项,例如上图中的(About,Tips和Plugins三项)。

这样一解释,它们之间的关系就清晰明了了。

下面是一个完整的例子:
gtk_menu_without_vbox.png


可以看到这个窗口中的菜单位置似乎有些跑偏(废话),主要是因为在这个窗口中只有一个GtkMenuBar部件,它会自动拉伸,铺满父容器。

这是我们就要加以限制了,不能让它胡作非为,可以通过把它放到其它的布局容器中来控制整个菜单栏的布局。

gtk_menu_with_vbox.png

这是加了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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-10 21:31:50 | 显示全部楼层
沙发~~~   谢谢LZ分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-10 21:41:24 | 显示全部楼层
代码好长哟、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表