#include <gtk/gtk.h> #include <strings.h> /* 必須的基本回呼 */ static void print_hello( GtkWidget *w, gpointer data ) { g_message ("Hello, World!n"); } /* 這是用來生成新選單的 GtkItemFactoryEntry 結構。 第一項:選單路徑。下劃線後的字母指出選單打開時 的快捷鍵。 第二項:這個項目的快捷鍵 第三項:回呼函式。 第四項:回呼動作。這個改變被呼叫的函式的參數。預設是0. 第五項:項類型,用來定義它是哪種項目, 這裡是可能的值: NULL -> "<Item>" "" -> "<Item>" "<Title>" -> 創建一個標題(title)項 "<Item>" -> 創建一個簡單(simple)項 "<CheckItem>" -> 創建一個檢查(check)項 "<ToggleItem>" -> 創建一個開關(toggle)項 "<RadioItem>" -> 創建一個選擇(radio)項 <path> -> 選擇項連接到的路徑 "<Separator>" -> 創建一個分隔線(separator) "<Branch>" -> 創建一個包含子項的項(可選) "<LastBranch>" -> 創建一個右對齊的分枝(branch) */ 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/sep1", 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 **menubar ) { GtkItemFactory *item_factory; GtkAccelGroup *accel_group; gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); accel_group = gtk_accel_group_new (); /* 這個函式初始化元件。 參數1:選單類型 - 可以是GTK_TYPE_MENU_BAR, GTK_TYPE_MENU, 或GTK_TYPE_OPTION_MENU。 參數2:選單路徑。 參數3:指向一個gtk_accel_group的指標。元件在生成選單時設置 好快捷鍵表格(accelerator table)。 */ 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 (menubar) /* 最後,傳回元件已經創建的功能欄。 */ *menubar = gtk_item_factory_get_widget (item_factory, "<main>"); } int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *main_vbox; GtkWidget *menubar; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_title (GTK_WINDOW (window), "Item Factory"); gtk_widget_set_size_request (GTK_WIDGET (window), 300, 200); main_vbox = gtk_vbox_new (FALSE, 1); gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 1); gtk_container_add (GTK_CONTAINER (window), main_vbox); gtk_widget_show (main_vbox); get_main_menu (window, &menubar); gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0); gtk_widget_show (menubar); gtk_widget_show (window); gtk_main (); return 0; } |
目前,這裡只有這個範例。以後會增加一個說明和許多’o’評論。
1 則留言