標籤:
1 定義
1.1 菜單由菜單條和功能表項目組成,它們的定義如下所示:
- 功能表項目(GtkMenuItem):添加到菜單條或下拉式功能表中構件
- 頂層功能表項目:添加到菜單條上的功能表項目稱為頂層功能表項目
- 下拉式功能表(GtkMenu):當滑鼠移動到某個功能表項目後顯示出來的菜單(GtkMenu)稱為下拉式功能表。它通常用來作為放置功能表項目的容器
1.2 菜單的建立
- 建立一個菜單條
- 往菜單條上添加功能表項目(頂層功能表項目)
- 建立一個下拉式功能表,並將該下拉式功能表作為頂層功能表項目的子功能表
1.3 相關函數
- ==============================================================================
菜單條操作
gtk_menu_bar_new:建立菜單條
gtk_menu_bar_append:往菜單條尾部添加功能表項目
gtk_menu_bar_prepend:往菜單條首部添加功能表項目
gtk_menu_bar_insert:往菜單條中指定的位置添加功能表項目
==============================================================================
- 功能表項目操作
gtk_menu_item_new_with_label:建立帶有標籤的功能表項目
gtk_menu_item_new:建立一個菜單分隔條(菜單分隔條實際上是不帶標籤的功能表項目)
gtk_menu_item_set_submenu:將一個下拉式功能表設定成指定功能表項目的子功能表
==============================================================================
- 下拉式功能表操作
gtk_menu_new:建立下拉式功能表
gtk_menu_append:往下拉式功能表尾部添加功能表項目
gtk_menu_prepend:往下拉式功能表首部添加功能表項目
gtk_menu_insert:往下拉式功能表中指定的位置添加功能表項目
2 菜單的使用
==============================================================================
建立菜單條
GtkWidget *menubar,*menu,*menuitemmenubar=gtk_menu_bar_new();
==============================================================================
往菜單條中添加頂層菜單
menuitem=gtk_menu_item_new_with_label("檔案");gtk_menu_bar_append(GTK_MENU_BAR(menubar),menuitem);gtk_widget_show(menuitem);
==============================================================================
建立下拉式功能表,並將其作為某個頂層功能表項目的子功能表
menu=gtk_menu_new();gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem),menu);
==============================================================================
往下拉式功能表中添加功能表項目
menuitem=gtk_menu_item_new_with_label("建立...");gtk_menu_append(GTK_MENU(menu),menuitem);
==============================================================================
功能表項目訊號處理
g_signal_connect(GTK_MENU_ITEM(menuitem),"activate",G_CALLBACK(event_handle),"new");
注意:
1. activate:當使用者單擊功能表項目是產生的訊號
2. 當所有功能表項目的回呼函數都相同時,我們可以通過分析往回呼函數傳遞的使用者資料來判斷到底使用者選擇的是哪個按鈕(因為不同構件在註冊某個訊號時可以傳遞各自的使用者資料)
==============================================================================
3 彈出式菜單
==============================================================================
用來顯示彈出式菜單的回呼函數的註冊
g_signal_connect_swapped (window, "button_press_event", G_CALLBACK (my_popup_handler), menu);
==============================================================================
顯示彈出式菜單的回呼函數
static gintmy_popup_handler (GtkWidget *widget, GdkEvent *event){ GtkMenu *menu; GdkEventButton *event_button; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); menu = GTK_MENU (widget); if (event->type == GDK_BUTTON_PRESS) { event_button = (GdkEventButton *) event; if (event_button->button == 3) { gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time); return TRUE; } } return FALSE;
5.使用GtkItemFactory來建立菜單============================================================================建立一個靜態GtkItemFactoryEntry類型的結構體數組,用來描述所要建立的菜單static GtkItemFactoryEntry menu_items[]={{"/File",NULL,NULL,0,""},{"/File/_New","N",event_handle,"New",NULL},{"/File/",NULL,NULL,0,""},{"/File/_Exit","E",quit_application,"Exit",NULL}};============================================================================建立一個快速鍵組,並將它與某個視窗關聯GtkAccelGroup* accel_group=gtk_accel_group_new();gtk_window_add_accel_group(GTK_WINDOW(window),accel_group);============================================================================建立一個GtkItemFactory,並指定一個快速鍵組,用來儲存功能表項目所對應的快速鍵GtkItemFactory* item_factory=gtk_item_factory_new(GTK_TYPE_MENU_BAR,"",accel_group);============================================================================使用GtkItemFactoryEntry數組來建立菜單nmenu_items=sizeof(menu_items)/sizeof(menu_items[0]);gtk_item_factory_create_items(item_factory,nmenu_items,menu_items,NULL);menubar=gtk_item_factory_get_widget(item_factory,"");============================================================================6.GtkItemFactoryEntry結構=================================================================================typedef struct {gchar *path; 功能表項目的路徑gchar *accelerator; 功能表項目對應的快速鍵GtkItemFactoryCallback callback; 回呼函數guint callback_action; 傳遞給回呼函數的gpointer參數gchar *item_type;/* item_type的可能取值:* NULL -> ""* "" -> ""* "
轉載來自:http://blog.chinaunix.net/uid-25547034-id-3027877.html
GTK 菜單的建立詳解