GTK编程基础----菜单选项
来源:互联网 发布:windows 2012 ping不通 编辑:程序博客网 时间:2024/06/17 22:52
菜单控件
创建菜单栏和子菜单时要用到三种构件:
• 一个菜单项(menu item),就是用户要选择的东西,比如,"Save"
• 一个菜单(menu),作为菜单项的容器。
• 一个菜单栏(menubar),是各个单独菜单的容器。
下面是创建菜单控件的一般步骤:
• 用 gtk_menu_new() 创建一个新的菜单
• 多次调用 gtk_menu_item_new() 创建每个你想在你的菜单上出现的菜单项。并使用 gtk_menu_append() 将每个新的菜单项放到
菜单上。
• 用 gtk_menu_item_new() 创建一个菜单项。这将是菜单的根(root),上面显示的文本将自己出现在菜单栏上。
• 用 gtk_menu_item_set_submenu() 将菜单绑定到根菜单项(就是上一步创建的那个)。
• 用 gtk_menu_bar_new 创建一个新的菜单栏。在一个菜单栏上创建一系列菜单时这步只要做一次就行了。
• 用 gtk_menu_bar_append() 将根菜单项放到菜单栏上。
创建一个弹出菜单和上面的几乎是一样,只是在设置回调函数时,如下:
g_signal_connect_swapped (G_OBJECT (widget), "event", G_CALLBACK (handler), G_OBJECT (menu));
其中widget是你要绑定到的构件,handler是处理函数,而menu是一个用 gtk_menu_new() 创建的菜单。它可以是一个也被菜单栏弹出的菜单。
看下面具体的例子:
/*File:menu_item.c *Date:2013-11-23 *Author:sjin *Mail:413977243@qq.com */#include <gtk/gtk.h>#include <stdio.h>static void menuitem_response(gchar *string){ printf("%s\n",string);}static int button_press(GtkWidget *widget,GdkEvent *event){ if(event->type == GDK_BUTTON_PRESS){ GdkEventButton *bevent = (GdkEventButton *)event; gtk_menu_popup(GTK_MENU(widget),NULL,NULL,NULL,NULL,bevent->button,bevent->time); /*告诉调用代码我们已经处理这个事件,*/ return TRUE; } /*else 未处理*/ return FALSE;}gint delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ){ /* 如果你的 "delete_event" 信号处理函数返回 FALSE,GTK 会发出 "destroy" 信号。 * 返回 TRUE,你不希望关闭窗口。 * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/ g_print ("delete event occurred\n"); /* 改 TRUE 为 FALSE 程序会关闭,关闭时调用destroy()。*/ return FALSE;}/* 另一个回调函数 */void destroy( GtkWidget *widget,gpointer data ){ gtk_main_quit ();}int main( int argc, char *argv[] ){ /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_items; GtkWidget *vbox; GtkWidget *button; char buf[128]; int i; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*设置窗口标题*/ gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!"); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL); /* 在这里我们连接 "destroy" 事件到一个信号处理函数。 * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值 * 都会触发这个事件。*/ g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL); /* 设置窗口边框的宽度。*/ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /*创建窗口宽度*/ gtk_widget_set_size_request(GTK_WIDGET(window),200,100); /*********************** * 初始化菜单构件 * 记住这里永远不要用gtk_widget_show()函数来显示菜单控件 * 这个是包含菜单项的菜单,运行程序时点击会弹出来 **********************/ menu = gtk_menu_new(); /*****************×××××××××× * * * *********************/ for(i = 0; i < 3; i++){ /*将名称复制到buf*/ sprintf(buf,"undetmenu-%d",i); /*创建一个菜单项*/ menu_items = gtk_menu_item_new_with_label(buf); /*将它添加到菜单*/ gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_items); /*当菜单被选中时的回调函数*/ g_signal_connect_swapped(G_OBJECT(menu_items),"activate",G_CALLBACK(menuitem_response),g_strdup(buf)); /*显示构件*/ gtk_widget_show(menu_items); } /******************************* *这个是根菜单,将成为现实在菜单栏上的标签 *这里不会附上信号处理函数,因为它只是在被按下时弹出的其余的菜单 *******************************/ root_menu = gtk_menu_item_new_with_label("根菜单"); gtk_widget_show(root_menu); /**************************** *指定想要穿件的menu成为根菜单 ***************************/ gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu),menu); /*将一个菜单和一个按钮放到纵向盒子里面*/ vbox = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show(vbox); /******************************** *创建一个菜单栏,并添加到主窗口 * *****************************/ menu_bar = gtk_menu_bar_new(); gtk_box_pack_start(GTK_BOX(vbox),menu_bar,FALSE,FALSE,2); gtk_widget_show(menu_bar); button = gtk_button_new_with_label("点击"); g_signal_connect_swapped(G_OBJECT(button),"event",G_CALLBACK(button_press),menu); gtk_box_pack_end(GTK_BOX(vbox),button,TRUE,TRUE,2); gtk_widget_show(button); /************************** *最后把惨淡想添加到菜单栏上 * ***************************/ gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar),root_menu); gtk_widget_show(window); gtk_main (); return 0;}
下面是利用gtk_item_factory来实现菜单选项:
/******************************* *使用套件生成菜单方式 *gtk_item_factory **********************//*File:menu_item2.c *Date:2014-03-23 *Author:sjin *Mail:413977243@qq.com */#include <gtk/gtk.h>#include <stdio.h>/*必要的回调函数*/static void print_hello(GtkWidget *w,gpointer data){ g_message("Hello,World!\n");}/**************************************** * 这是用来生成新惨淡的GtkItemFactoryEntry结构 * 第一项 菜单路径 下划线后字母指出惨淡打开的快捷键 * 第二项:这个条目的快捷键 * 第三项:回调函数 * 第四项,回调动作 * 第五项:项类型用 * NULL -> "Item" * "" "Item" * "<Title>" 标题 * "<Item>" 创建一个简单的项 * "<CheckItem>" 创建一个检查项 * "<ToggleItem>" 创建一个开关项 * "<RadioItem>" 创建一个选择项 * <path> 选择项链接到的路径 * "<Separator>" 分割线 * "Branch" 创建一个包含子项的项 * "LastBranch" 创建一个右对齐的分支 *************************************/static GtkItemFactoryEntry menu_items[] = { {"/_File", NULL, NULL,0,"<Branch>"}, {"/File/_New", "<control>N", print_hello,0,NULL}, {"/File/_Open", "<control>O", print_hello,0,NULL}, {"/File/_Save", "<control>S" ,print_hello,0,NULL}, {"/File/Save _As", NULL,NULL,0,NULL}, {"/File/sepl", NULL,NULL,0,"<Separator>"}, {"/File/Quit", "<control>Q", gtk_main_quit,0,NULL}, {"/_Options", NULL,NULL,0,"<Branch>"}, {"/Options/Test", NULL,NULL,0,NULL}, {"/_Help", NULL,NULL,0,"<LastBranch>"}, {"/Help/About", NULL,NULL,0,NULL},};void get_main_menu(GtkWidget *window,GtkWidget **menu_bar){ GtkItemFactory *item_factory; GtkAccelGroup *accel_group; gint nmenu_items = sizeof(menu_items)/sizeof(menu_items[0]); accel_group = gtk_accel_group_new(); /**************************** *这个函数初始化套件 *参数1:菜单类型- *参数2:菜单路径 *参数3:指向一个gtk_accel_group 的指针 * *****************************/ item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"<main>",accel_group); /*生成菜单项,把数组里想的数量,数组自身,和菜单项的任意 * 回调函数以此传递给套件*/ gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL); /*把新的加速组绑定到窗口*/ gtk_window_add_accel_group(GTK_WINDOW(window),accel_group); if(menu_bar){ /*返回套件已经创建的菜单栏*/ *menu_bar = gtk_item_factory_get_widget(item_factory,"<main>"); }}gint delete_event( GtkWidget *widget,GdkEvent *event,gpointer data ){ /* 如果你的 "delete_event" 信号处理函数返回 FALSE,GTK 会发出 "destroy" 信号。 * 返回 TRUE,你不希望关闭窗口。 * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/ g_print ("delete event occurred\n"); /* 改 TRUE 为 FALSE 程序会关闭,关闭时调用destroy()。*/ return TRUE;}/* 另一个回调函数 */void destroy( GtkWidget *widget,gpointer data ){ gtk_main_quit ();}int main( int argc, char *argv[] ){ /* GtkWidget 是构件的存储类型 */ GtkWidget *window; GtkWidget *menu_bar; GtkWidget *vbox; /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/ gtk_init (&argc, &argv); /* 创建一个新窗口 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /*设置窗口标题*/ gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!"); /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭” * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。 * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/ g_signal_connect (G_OBJECT (window), "delete_event",G_CALLBACK (delete_event), NULL); /* 在这里我们连接 "destroy" 事件到一个信号处理函数。 * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值 * 都会触发这个事件。*/ g_signal_connect (G_OBJECT (window), "destroy",G_CALLBACK (destroy), NULL); /* 设置窗口边框的宽度。*/ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /*创建窗口宽度*/ gtk_widget_set_size_request(GTK_WIDGET(window),200,100); vbox = gtk_vbox_new(FALSE,1); gtk_container_add(GTK_CONTAINER(window),vbox); gtk_widget_show(vbox); get_main_menu(window,&menu_bar); gtk_box_pack_start(GTK_BOX(vbox),menu_bar,FALSE,TRUE,0); gtk_widget_show(menu_bar); gtk_widget_show(window); gtk_main (); return 0;}
问题:在运行后无法将菜单栏显示出来的的问题?
运行程序需要ROOT权限。具体原因不清楚。。
1 0
- GTK编程基础----菜单选项
- GTK编程基础------对话框
- GTK编程基础----按钮构件
- GTK编程基础-----滚动窗口
- GTK编程基础----笔记本控件、
- GTK+-3.0编程 (七) 菜单的创建
- GTK编程基础---入门篇(helloworld)
- GTK编程基础---组装盒,表组装
- Windows基础编程 -菜单
- Gtk+/Glade编程(三) 菜单和工具栏
- Gtk /Glade编程(三) 菜单和工具栏
- Gtk+ 基础
- GTK+ 基础
- GTK 编程
- GTK编程
- 选项菜单
- 选项菜单
- GTK 菜单 快捷键
- 通过反编译得到 优酷视频 真实地址
- CocoaPods安装和使用教程
- 计算机专业笔试题
- 'CREATE FUNCTION' 必须是查询批次中的第一个语句。
- 对于大数据量的Json解析
- GTK编程基础----菜单选项
- error: expected ‘)’ before ‘PRIx64’
- sql delete 跨表条件判断跨表条件验证
- Nagios分布式配置
- 传统文化学习——佛教篇
- mysql获取执行插入数据后的id
- Flash手游《孤胆英雄》独立开发者专访
- 数据结构和算法系列16 哈夫曼树
- 第四周项目1--三角形类