這些應該差不多了。現在看一個範例來幫你弄明白些。
#include <stdio.h> #include <gtk/gtk.h> static gboolean button_press (GtkWidget *, GdkEvent *); static void menuitem_response (gchar *); int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_items; GtkWidget *vbox; GtkWidget *button; char buf[128]; int i; gtk_init (&argc, &argv); /* 創建一個新視窗 */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100); gtk_window_set_title (GTK_WINDOW (window), "GTK Menu Test"); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); /* 初始化選單元件,記住,永遠也不要用 * gtk_show_widget() 來顯示選單元件。 * 這個是包含選單項的選單,當你在程式的"Root Menu"上點擊時 * 它會彈出來 */ menu = gtk_menu_new (); /* 接著我們用一個小循環為"test-menu"產生三個選單項目。 * 注意對gtk_menu_append的呼叫。這裡我們將一序列的選單項 * 加到我們的選單上。通常,我們也捕獲每個選單項的"clicked" * 信號並為它設置一個回呼,不過在這裡這個被省略了以節省空間。 */ for (i = 0; i < 3; i++) { /* 將名稱複製到buf. */ sprintf (buf, "Test-undermenu - %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 (menu_items, "activate", G_CALLBACK (menuitem_response), (gpointer) g_strdup (buf)); /* 顯示元件 */ gtk_widget_show (menu_items); } /* 這個是根選單,將成為顯示在選單欄上的標籤。 * 這裡不會附上一個信號處理函式,因為它只是在 * 被按下時彈出其餘的選單。 */ root_menu = gtk_menu_item_new_with_label ("Root Menu"); gtk_widget_show (root_menu); /* 現在我們指定我們想要讓新創建的"menu"成 * 為"root 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 ("press me"); g_signal_connect_swapped (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; } /* 對滑鼠按下作出回應,彈出widget變數傳遞進來的選單。 * * 注意"widget"參數是被傳遞進來的選單,不是 * 被按下的按鈕。 */ static gboolean 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); /* Tell calling code that we have handled this event; the buck * stops here. */ return TRUE; } /* 告訴呼叫程式碼我們已經處理了這個事件;事件傳播(buck)在 * 這裡停止。 */ return FALSE; } /* 當選單項被選中時列印一個字串 */ static void menuitem_response( gchar *string ) { printf ("%sn", string); } |
你也可以設置一個選單項為不敏感(insensitive),也可以使用一個加速表(accelerator table),系結按鍵到選單函式。
<<< Previous | 單元首頁 | Next >>> |
GTK+ 2.0 教學-選單元件 | 向上 | GTK+ 2.0 教學-使用ItemFactory |
請問這是用來lay甚麼產品的工具?是ic layout嗎?
這一篇沒有任何”lay”…的字眼,人客,你是不是回錯文了?
所以第二個問題應該也不成立吧。