用gtk写的动态添加删除菜单、菜单项、子菜单的接口
2010-01-29 16:11
609 查看
接口代码:
menu.h
/*
* menu.h
*
* -- Dynamic menu facility.
*/
#ifndef __MENU_H__
#define __MENU_H__
struct path_nc
{
char *path_name[100];
int i;
};
/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item);
/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[]);
/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[]);
/* 在菜单条中插入一个菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position);
/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data);
/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[]);
#endif
menu.c
/*
*
* menu.c
*
* -- Dynamic menu facility.
*/
#include <gtk/gtk.h>
#include <string.h>
#include "menu.h"
/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item)
{
if(GTK_BIN(menu_item)->child)
{
GtkWidget *child;
child = GTK_BIN(menu_item)->child;
if(GTK_IS_LABEL(child))
{
gchar *text;
gtk_label_get(GTK_LABEL(child), &text);
return text;
}
}
}
/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[])
{
char *name = NULL;
struct path_nc pnc;
char *p = "/";
int i = 0;
path = strdup(path);
name = strtok(path, p);
while(name != NULL)
{
pnc.path_name[i] = name;
name = strtok(NULL, p);
i++;
pnc.i = i;
}
return pnc;
}
/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[])
{
GList *menu_list = NULL;
gchar *purpose_menu_name = NULL;
GtkWidget *purpose_menu;
GtkWidget *all_menubar;
gboolean yes_no = FALSE;
GtkWidget *menu;
GtkWidget *rootmenu;
int j = 0, k = 1, l = 0;
struct path_nc pnc;
pnc = g_path_get(path);
all_menubar = menu_shell;
for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}
if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
}
else
{
for(l=0; l<(pnc.i-k); l++)
{
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[j]);
j++;
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
gtk_menu_shell_append(GTK_MENU_SHELL(all_menubar), rootmenu);
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(rootmenu));
gtk_widget_show_all(menu);
}
break;
}
k++;
yes_no = FALSE;
}
return all_menubar;
}
/* 在菜单条中插入一个菜单/子菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position)
{
GtkWidget *menu;
GtkWidget *rootmenu;
GtkWidget *purpose_menu;
struct path_nc pnc;
pnc = g_path_get(path);
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
if(pnc.i == 1)
{
gtk_menu_shell_insert(GTK_MENU_SHELL(menu_shell), rootmenu, position-1);
}
else
{
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), rootmenu, position-1);
}
gtk_widget_show_all(menu);
return menu;
}
/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data)
{
GtkWidget *item;
gint menu_len;
GtkWidget *purpose_menu;
struct path_nc pnc;
pnc = g_path_get(path);
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
item = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), item, position-1);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(callback), data);
gtk_widget_show(item);
return item;
}
/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[])
{
GList *list = NULL, *lt = NULL;
GList *menu_list = NULL;
GtkWidget *purpose_menu, *menu_item;
GtkWidget *all_menubar;
gchar *purpose_menu_name = NULL;
int j = 0, position = 0;
struct path_nc pnc;
gboolean yes_no = FALSE;
pnc = g_path_get(path);
all_menubar = menu_shell;
for(j=0; j<pnc.i-1; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}
if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
yes_no = FALSE;
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n/n/n", pnc.path_name[j]);
yes_no = TRUE;
break;
}
}
if(!yes_no)
{
purpose_menu = all_menubar;
for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
menu_item = menu_list->data;
yes_no = TRUE;
break;
}
}
}
if(yes_no)
{
list = g_list_find(GTK_MENU_SHELL(purpose_menu)->children, menu_item);
GTK_MENU_SHELL(purpose_menu)->children = g_list_remove(GTK_MENU_SHELL(purpose_menu)->children, list->data);
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n", pnc.path_name[pnc.i-1]);
return;
}
}
else
return;
}
测试程序:
addmenu.c
/*hxy--addmenu*/
#include <gtk/gtk.h>
#include "menu.h"
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *rootmenu,*menubar;
GtkWidget *menu;
GtkWidget *item;
gchar *ch;
gint i;
GtkWidget *testmenu;
GtkWidget *all_menubar;
struct path_nc pnc;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Add menu test");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
menubar = gtk_menu_bar_new();
gtk_box_pack_start(GTK_BOX(vbox),menubar,0,0,0);
menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu");
item = gtk_menu_item_new_with_label("menuitem 1");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = gtk_menu_item_new_with_label("menuitem 2");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
ch = g_menu_item_get_label(item);
printf("%s/n", ch);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);
pnc = g_path_get("File/recent/1");
//printf("%s/n", pnc.path_name[1]);
//printf("%d/n", pnc.i);
//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 1", 1, gtk_main_quit, NULL);
menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu 2");
item = gtk_menu_item_new_with_label("menuitem 21");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = gtk_menu_item_new_with_label("menuitem 22");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);
//menu = g_menu_shell_insert_menu(menubar, "menu 1", 1);
//item = g_menu_shell_insert_item(menubar, "/menu 1/item 4", 2, gtk_main_quit, NULL);
menu = g_menu_shell_insert_menu(menubar, "/rootmenu/submenu", 2);
//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 6", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 7/a/b/c/d/f/g/h/i", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 8", 10, gtk_main_quit, NULL);
g_menu_shell_delete(menubar, "/rootmenu/submenu/item 77");
//g_menu_shell_delete(menubar, "/rootmenu/submenu");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
menu.h
/*
* menu.h
*
* -- Dynamic menu facility.
*/
#ifndef __MENU_H__
#define __MENU_H__
struct path_nc
{
char *path_name[100];
int i;
};
/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item);
/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[]);
/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[]);
/* 在菜单条中插入一个菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position);
/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data);
/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[]);
#endif
menu.c
/*
*
* menu.c
*
* -- Dynamic menu facility.
*/
#include <gtk/gtk.h>
#include <string.h>
#include "menu.h"
/* 获得菜单项的名字 */
gchar *g_menu_item_get_label (GtkWidget *menu_item)
{
if(GTK_BIN(menu_item)->child)
{
GtkWidget *child;
child = GTK_BIN(menu_item)->child;
if(GTK_IS_LABEL(child))
{
gchar *text;
gtk_label_get(GTK_LABEL(child), &text);
return text;
}
}
}
/* 获得path的各个名字和个数 */
struct path_nc g_path_get(char path[])
{
char *name = NULL;
struct path_nc pnc;
char *p = "/";
int i = 0;
path = strdup(path);
name = strtok(path, p);
while(name != NULL)
{
pnc.path_name[i] = name;
name = strtok(NULL, p);
i++;
pnc.i = i;
}
return pnc;
}
/* 获得菜单, 比如 "/文件/打开..." */
GtkWidget *g_menu_shell_get_menu (GtkWidget *menu_shell, char path[])
{
GList *menu_list = NULL;
gchar *purpose_menu_name = NULL;
GtkWidget *purpose_menu;
GtkWidget *all_menubar;
gboolean yes_no = FALSE;
GtkWidget *menu;
GtkWidget *rootmenu;
int j = 0, k = 1, l = 0;
struct path_nc pnc;
pnc = g_path_get(path);
all_menubar = menu_shell;
for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}
if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
}
else
{
for(l=0; l<(pnc.i-k); l++)
{
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[j]);
j++;
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
gtk_menu_shell_append(GTK_MENU_SHELL(all_menubar), rootmenu);
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(rootmenu));
gtk_widget_show_all(menu);
}
break;
}
k++;
yes_no = FALSE;
}
return all_menubar;
}
/* 在菜单条中插入一个菜单/子菜单 */
GtkWidget *g_menu_shell_insert_menu (GtkWidget *menu_shell,
char path[],
int position)
{
GtkWidget *menu;
GtkWidget *rootmenu;
GtkWidget *purpose_menu;
struct path_nc pnc;
pnc = g_path_get(path);
rootmenu = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
menu = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu), menu);
if(pnc.i == 1)
{
gtk_menu_shell_insert(GTK_MENU_SHELL(menu_shell), rootmenu, position-1);
}
else
{
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), rootmenu, position-1);
}
gtk_widget_show_all(menu);
return menu;
}
/* 在菜单中插入一个菜单项 */
GtkWidget *g_menu_shell_insert_item (GtkWidget *menu_shell,
char path[],
int position,
GCallback callback,
gpointer data)
{
GtkWidget *item;
gint menu_len;
GtkWidget *purpose_menu;
struct path_nc pnc;
pnc = g_path_get(path);
purpose_menu = g_menu_shell_get_menu(menu_shell, path);
item = gtk_menu_item_new_with_label(pnc.path_name[pnc.i-1]);
gtk_menu_shell_insert(GTK_MENU_SHELL(purpose_menu), item, position-1);
g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(callback), data);
gtk_widget_show(item);
return item;
}
/* 删除一个菜单项 */
void g_menu_shell_delete (GtkWidget *menu_shell, char path[])
{
GList *list = NULL, *lt = NULL;
GList *menu_list = NULL;
GtkWidget *purpose_menu, *menu_item;
GtkWidget *all_menubar;
gchar *purpose_menu_name = NULL;
int j = 0, position = 0;
struct path_nc pnc;
gboolean yes_no = FALSE;
pnc = g_path_get(path);
all_menubar = menu_shell;
for(j=0; j<pnc.i-1; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
purpose_menu = menu_list->data;
yes_no = TRUE;
break;
}
}
if(yes_no)
{
all_menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(purpose_menu));
yes_no = FALSE;
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n/n/n", pnc.path_name[j]);
yes_no = TRUE;
break;
}
}
if(!yes_no)
{
purpose_menu = all_menubar;
for(j=0; j<pnc.i; j++)
{
for(menu_list = GTK_MENU_SHELL(all_menubar)->children; menu_list; menu_list = menu_list->next)
{
purpose_menu_name = g_menu_item_get_label(menu_list->data);
if(!strcmp(purpose_menu_name, pnc.path_name[j]))
{
menu_item = menu_list->data;
yes_no = TRUE;
break;
}
}
}
if(yes_no)
{
list = g_list_find(GTK_MENU_SHELL(purpose_menu)->children, menu_item);
GTK_MENU_SHELL(purpose_menu)->children = g_list_remove(GTK_MENU_SHELL(purpose_menu)->children, list->data);
}
else
{
printf("Please cheak your PATH!/nIs there %s ?/n", pnc.path_name[pnc.i-1]);
return;
}
}
else
return;
}
测试程序:
addmenu.c
/*hxy--addmenu*/
#include <gtk/gtk.h>
#include "menu.h"
int main(int argc,char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *rootmenu,*menubar;
GtkWidget *menu;
GtkWidget *item;
gchar *ch;
gint i;
GtkWidget *testmenu;
GtkWidget *all_menubar;
struct path_nc pnc;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Add menu test");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
vbox = gtk_vbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),vbox);
menubar = gtk_menu_bar_new();
gtk_box_pack_start(GTK_BOX(vbox),menubar,0,0,0);
menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu");
item = gtk_menu_item_new_with_label("menuitem 1");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = gtk_menu_item_new_with_label("menuitem 2");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
ch = g_menu_item_get_label(item);
printf("%s/n", ch);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);
pnc = g_path_get("File/recent/1");
//printf("%s/n", pnc.path_name[1]);
//printf("%d/n", pnc.i);
//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 1", 1, gtk_main_quit, NULL);
menu = gtk_menu_new();
rootmenu = gtk_menu_item_new_with_label("rootmenu 2");
item = gtk_menu_item_new_with_label("menuitem 21");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
item = gtk_menu_item_new_with_label("menuitem 22");
gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(rootmenu),menu);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar),rootmenu);
//menu = g_menu_shell_insert_menu(menubar, "menu 1", 1);
//item = g_menu_shell_insert_item(menubar, "/menu 1/item 4", 2, gtk_main_quit, NULL);
menu = g_menu_shell_insert_menu(menubar, "/rootmenu/submenu", 2);
//item = g_menu_shell_insert_item(menubar, "/rootmenu/item 6", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 7/a/b/c/d/f/g/h/i", 1, gtk_main_quit, NULL);
item = g_menu_shell_insert_item(menubar, "/rootmenu/submenu/item 8", 10, gtk_main_quit, NULL);
g_menu_shell_delete(menubar, "/rootmenu/submenu/item 77");
//g_menu_shell_delete(menubar, "/rootmenu/submenu");
gtk_widget_show_all(window);
gtk_main();
return 0;
}
相关文章推荐
- 动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- 如何在MFC中动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单 .
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- 动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- 动态添加菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC中动态创建N级菜单以及响应事件——续——动态添加菜单/菜单项、子菜单、右键菜单
- 动态添加菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- 如何动态添加菜单/菜单项、子菜单、右键菜单
- MFC中的CMenu---如何动态添加菜单/菜单项、子菜单、右键菜单