GTK+多級菜單的實現
學習筆記
2009-12-16 20:20:54
閱讀106
評論0
字型大小:大
中
小
訂閱
GTK+建立菜單的方式有多種,這裡採用的是手工建立菜單的方式。建立多級菜單的過程和方法與建立普通的菜單方法相同,之所以能夠實現菜單的分級形式,關鍵就是重建立立一個菜單,然後將其添加到需要下級菜單的功能表項目中。下面的代碼是整理於一位網友的代碼所得:
#include <gtk/gtk.h>
GtkWidget* form1;
GtkWidget* box1;
GtkWidget* menubar;
GtkWidget* menuitem1;
GtkWidget* menuitem2;
GtkWidget* menuitem3;
GtkWidget* menu1;
GtkWidget* menu2;
GtkWidget* menuitem1_1;
GtkWidget* menuitem1_2;
GtkWidget* menuitem1_3;
GtkWidget* menuitem2_1;
GtkWidget* menuitem2_2;
GtkWidget* menu1_1;
GtkWidget* menuitem1_1_1;
GtkWidget* menuitem1_1_2;
void pt(GtkWidget* w, gpointer p);
int main(int argc, char *argv[])
{gtk_init(&argc,&argv);
form1=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(form1), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
box1=gtk_vbox_new(FALSE,0);
//建立菜單條並把第一級功能表項目放入
menubar=gtk_menu_bar_new();//建立菜單條
menuitem1=gtk_menu_item_new_with_label(" 菜單 1");//建立功能表項目
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem1);//把功能表項目加入到菜單條中
menuitem2=gtk_menu_item_new_with_label(" 菜單 2 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem2);
menuitem3=gtk_menu_item_new_with_label(" 菜單 3 ");
gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem3);
//建立menuitem1的子功能表
menu1=gtk_menu_new();//建立菜單
menuitem1_1=gtk_menu_item_new_with_label(" 一級菜單 1_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_1);//把功能表項目加入到菜單中
menuitem1_2=gtk_menu_item_new_with_label(" 一級菜單 1_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_2);
menuitem1_3=gtk_menu_item_new_with_label(" 一級菜單 1_3 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1),menuitem1_3);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem1),menu1);//最後把菜單menu1粘到功能表項目menuitem1上
//如法炮製menuitem2的子功能表
menu2=gtk_menu_new();
menuitem2_1=gtk_menu_item_new_with_label(" 一級菜單 2_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_1);
menuitem2_2=gtk_menu_item_new_with_label(" 一級菜單 2_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu2),menuitem2_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem2),menu2);
//建立二級子功能表,多級菜單的實現關鍵的地方就是 menu1_1=gtk_menu_new() 這一句建立語句,這是第一點
menu1_1=gtk_menu_new();
menuitem1_1_1=gtk_menu_item_new_with_label(" 二級菜單 1_1_1 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1_1),menuitem1_1_1);
menuitem1_1_2=gtk_menu_item_new_with_label(" 二級菜單 1_1_2 ");
gtk_menu_shell_append(GTK_MENU_SHELL(menu1_1),menuitem1_1_2);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem1_1),menu1_1); //將子功能表加入需要子功能表的功能表項目
//串連訊號和函數
gtk_signal_connect(GTK_OBJECT(menuitem1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1"));
gtk_signal_connect(GTK_OBJECT(menuitem2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2"));
gtk_signal_connect(GTK_OBJECT(menuitem3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem3"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1"));
gtk_signal_connect(GTK_OBJECT(menuitem1_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_2"));
gtk_signal_connect(GTK_OBJECT(menuitem1_3), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_3"));
gtk_signal_connect(GTK_OBJECT(menuitem2_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_1"));
gtk_signal_connect(GTK_OBJECT(menuitem2_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem2_2"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1_1), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1_1"));
gtk_signal_connect(GTK_OBJECT(menuitem1_1_2), "activate", GTK_SIGNAL_FUNC(pt), (gpointer)("menuitem1_1_2"));
gtk_box_pack_start(GTK_BOX(box1),menubar,FALSE,FALSE,0);
gtk_container_add(GTK_CONTAINER(form1),box1);
gtk_window_set_default_size(GTK_WINDOW(form1),400,200);
gtk_widget_show_all(form1);
gtk_main();
return(0);
}
void pt(GtkWidget* w, gpointer p)
{g_print("%s/n",(gchar*)p);
}