界面的功能特色---菜单栏和工具栏

“菜单”(menubar)是GUI程序中最为常见的部分之一.各种各样的功能都能使用菜单来实现.

下面这个例子生成一个含有文件菜单的菜单栏,并且文件菜单将只有一个菜单条(menu item).点击之后程序将会退出.

#include <gtk/gtk.h>
int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *menubar;
    GtkWidget *filemenu;
    GtkWidget *file;
    GtkWidget *quit;

    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,200);
    gtk_window_set_title(GTK_WINDOW(window),"menu");
    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    menubar = gtk_menu_bar_new();
    filemenu = gtk_menu_new();
    file = gtk_menu_item_new_with_label("File");
    quit = gtk_menu_item_new_with_label("Quit");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file),filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);
    gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,3);
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(quit),"activate",G_CALLBACK(gtk_main_quit),NULL);

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

在上面生成菜单栏的过程中理解起来可能会有些问题,在GTK中,需要记住的是一个菜单栏和一个菜单的都是源属于同一个构件的,被称作菜单外壳(menu shell).菜单选项(menu item)是一个只对菜单有效的子构件.

menubar = gtk_menu_bar_new();
filemenu = gtk_menu_new();

这两行代码分别生成可一个菜单栏构件和一个菜单构件.

gtk_menu_item_set_submenu(GTK_MNU_ITEM(file),filemenu);

上面的代码会生生成一个名为”File”的菜单,这也就是说菜单栏就是一个菜单外壳.很显然,这里的文件菜单也是一个菜单外壳.

gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);

菜单选项有函数gtk_menu_shell_append()来实现,然后一般情况下选项被添加进菜单外壳里.在这个例子中,
“quit”菜单项被添加到”file”菜单栏中,然后file被添加到menubar中.

现在我们看一下下面几个函数:

1):
gtk_vbox_new();
我们看一下函数的定义:

GtkWidget *
gtk_vbox_new (gboolean homogeneous, gint spacing);

该函数会创建一个新的GtkVBox.
参数:
homogeneous: 如果所有的孩子都给予相同的空间分配,则该值为TRUE
spacing: ​ ​ ​孩子之间相隔的像素点的个数

下面我们看一下GtkVBox,下面是官方定义:

GtkVBox—-一个纵向的容器盒子

2):
gtk_box_pack_start()
下面我们看一下该函数头的定义:

void
gtk_box_pack_start (GtkBox *box,
                    GtkWidget *child,
                    gboolean expand,
                    gboolean fill,
                    guint padding);

该函数用于想box中添加孩子,从盒子的开始连同引用一起打包.就相当于按照添加的顺序一个一个打包,从盒子的开始.

参数:
​box: ​一个GtkBox
​child: ​被添加到box的GtkWidget
​expand: 如果新的孩子被给予额外的盒子的空间,该值为TRUE.额外的空间将会在所有使用这个选项的孩子之间平均分配
​fill: 如果被expand选项给予孩子的空间实际上就是分配给孩子的空间的话,该值为TRUE.当expand设置为FALSE的时候,​这个值是没有用的.
​padding: 在这个孩子和他的邻居之间设置的以像素为单位的额外空间.

3):
g_signal_connect()和g_signal_connect_swapped()的区别,这个在后面讨论,i敬请期待.

先看一下我的程序运行的结果:

下面是生成的带有快捷方式和图像的菜单栏,至于其添加的方式我们后面了解,先看一下我的代码:

#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
int main(int argc,char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *menubar;
    GtkWidget *filemenu;
    GtkWidget *file;
    GtkWidget *new;
    GtkWidget *open;
    GtkWidget *quit;
    GtkWidget *sep;

    GtkAccelGroup *accel_group = NULL;
    gtk_init(&argc,&argv);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
    gtk_window_set_default_size(GTK_WINDOW(window),250,200);
    gtk_window_set_title(GTK_WINDOW(window),"menu");
    vbox = gtk_vbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(window),vbox);
    menubar = gtk_menu_bar_new();

    filemenu = gtk_menu_new();

    accel_group = gtk_accel_group_new();
    gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);

    file = gtk_menu_item_new_with_label("_File");
    new = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW,NULL);
    open = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,NULL);
    sep = gtk_separator_menu_item_new();

    quit = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,accel_group);
    gtk_widget_add_accelerator(quit,"activate",accel_group,GDK_q,GDK_CONTROL_MASK,
    GTK_ACCEL_VISIBLE);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file),filemenu);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),new);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),open);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),sep);
    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu),quit);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar),file);
    gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE,FALSE,3);
    g_signal_connect_swapped(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect(G_OBJECT(quit),"activate",G_CALLBACK(gtk_main_quit),NULL);
    gtk_widget_show_all(window);
    gtk_main();

    return 0;
}

下面是我的程序运行后,菜单栏打开后的效果:

未完,待续!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天堂1223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值