汉扬编程 C语言入门 用GTK+来创建一个带界面的C语言程序7——菜单的创建

用GTK+来创建一个带界面的C语言程序7——菜单的创建

完整的图形界面应用程序应该包括主窗口、菜单条、工具条、状态栏、窗口主题区域等元素。而菜单在图形界面编程中经常会用到,稍微复杂的应用程序一般都会有多个菜单项来执行各种不同的任务。菜单是由菜单条(GtkMenuBar)和从菜单条或其他菜单下拉的菜单(GtkMenu)组成。GTK+为我们提供了一套非常容易的设计菜单的方法,使用几行代码就可以为程序中添加多个菜单项。在这一节将介绍如何使用GTK+提供的方法来为窗口添加菜单条,并为菜单条添加多个菜单项,以及为菜单的项的信号添加回调函数。

用GTK+来创建一个带界面的C语言程序7——菜单的创建

在建立菜单条以前必须先建立应用程序的纵向组合框。在GTK+中向窗口中添加菜单的步骤一般是:

用GTK+来创建一个带界面的C语言程序7——菜单的创建

(1)创建菜单条(GtkMenuBar)

用GTK+来创建一个带界面的C语言程序7——菜单的创建

将菜单条加入到纵向的组合框中。使用函数gtk_menu_bar_new()建立GtkMenuBar构件。函数原型为:

用GTK+来创建一个带界面的C语言程序7——菜单的创建

GtkWidget * gtk_menu_bar_new(void);

//创建菜单条

menubar = gtk_menu_bar_new();

gtk_box_pack_start(GTK_BOX(vbox),menubar,FALSE, FALSE, 0);

(2)创建菜单项。

当创建好菜单条后,此时的菜单条还是空的,还需要向菜单条中增加菜单项(GtkMenuItem)。使用gtk_menu_item_new_with_label建立一个带有标号的菜单项。例如我们经常在带有菜单条的程序中看到的“文件”菜单项,就可以使用下面这条语句来创建:

menuitem= gtk_menu_item_new_with_laibel(“文件”);

创建菜单项的函数原型为:

GtkWIdget * gtk_menu_item_new_with_label(const gchar*label);

label:菜单项的标号

(3)将菜单加入到菜单条中

在创建完菜单项后,这时就可以将它加入到前面建立的菜单条中了。使用gtk_menu_shell_append这个函数来将菜单项加入到菜单条中。

gtk_menu_bar_append(GTK_MENU_SHELL(menubar), menuitem);

其函数原型为:

void gtk_menu_shell_append(GtkMenuShell * menu, GtkWidget * child);

menu:菜单

child:菜单项

菜单创建

(4)创建菜单项,并加入到菜单中

一个简单的菜单条已经创建好了,但是我们知道大多数菜单还包括一个子菜单,这个子菜单只有在下拉菜单的时候才能看到,例如当我们选择“文件”菜单项时,会在下面出现一个子菜单。里面有新建、打开、保存等选项。如下图:

程序中的下拉子菜单

在GTK+编程中子菜单的创建方法是先建立包含新建、打开、保存、退出等选项的新菜单,然后用gtk_menu_item_set_submenu函数将新菜单和“文件”菜单项联系起来就可以了。

建立子菜单项和建立父菜单项的函数是一样的,都是使用gtk_menu_item_new_with_label。创建菜单则使用gtk_menu_new函数来创建。

创建菜单:GtkWidget * gtk_menu_new(void);

建立子菜单和父菜单项的联系:void gtk_menu_item_set_submenu(GtkMenuItem* menu_item, GtkWidget * submenu);

menu_item:父菜单项

submenu:子菜单

代码如下:

/*菜单的创建和使用*/

#include <gtk/gtk.h>

GtkWidget * CreatMenuItem(GtkWidget * menuBar, char * menuitem);

GtkWidget * CreateMnun(GtkWidget * menuitem);

int main(int argc, char * argv[])

{

GtkWidget * window;

GtkWidget * box;

GtkWidget * menubar;

GtkWidget * menuitem;

gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_window_set_title(GTK_WINDOW(window), "菜单条创建");

g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

gtk_window_set_default_size(GTK_WINDOW(window), 500, 400);

gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);

//创建一个纵向的盒子容器

box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);

gtk_container_add(GTK_CONTAINER(window), box);

menubar = gtk_menu_bar_new();

gtk_box_pack_start(GTK_BOX(box), menubar, FALSE, TRUE, 0);

menuitem = CreatMenuItem(menubar, "文件");

CreateMnun(menuitem);

CreatMenuItem(menubar, "编辑");

CreatMenuItem(menubar, "帮助");

gtk_widget_show_all(window);

gtk_main();

return FALSE;

}

GtkWidget * CreatMenuItem(GtkWidget * menuBar, char * item)

{

GtkWidget * menuitem;

menuitem = gtk_menu_item_new_with_label(item);

gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuitem);

return menuitem;

}

GtkWidget * CreateMnun(GtkWidget * menuitem)

{

GtkWidget * menu; //定义子菜单

menu = gtk_menu_new(); //创建子菜单

CreatMenuItem(menu, "新建");

CreatMenuItem(menu, "打开");

CreatMenuItem(menu, "保存");

CreatMenuItem(menu, "退出");

gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menu);//将父菜单和子菜单联系起来

}

运行结果:

菜单和子菜单建立

(5)菜单项的信号

到现在为止,我们的菜单已经建立起来了,当然还有一项工作没有做,就是还没有对菜单项的信号进行处理。菜单项的信号不多,最常用的是“activate”信号,表示菜单被激活(被单击),也用g_signal_connect宏来连接,格式同按钮的“clicked”信号相同。例如当用户点击退出时,程序退出。

子菜单信号处理

这一节中用到的函数:

创建菜单条:gtk_menu_bar_new();

创建菜单:gtk_menu_new();

创建带有标号的菜单项:gtk_menu_item_new_with_label();

向菜单条加菜单:gtk_menu_shell_append();

设定菜单项的子菜单:gtk_menu_item_set_submenu();

创建菜单中的横线:gtk_separator_menu_item_new();

创建菜单中的虚线:gtk_tearoff_menu_item_new();

后两个函数在本例中没有出现,读者可以试着自己加进去。此外菜单项还有另外两种形式,单选菜单和多选菜单项。有兴趣的读者可以试着自己做一下。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/6623.html

学得浅碎不如无——四元数、矢量分析与线性代数关系剖析

Linux下C和C++程序中内存泄露检测

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部