GTK 菜單的建立詳解

來源:互聯網
上載者:User

標籤:

1 定義

1.1 菜單由菜單條和功能表項目組成,它們的定義如下所示:

  1. 功能表項目(GtkMenuItem):添加到菜單條或下拉式功能表中構件
  2. 頂層功能表項目:添加到菜單條上的功能表項目稱為頂層功能表項目
  3. 下拉式功能表(GtkMenu):當滑鼠移動到某個功能表項目後顯示出來的菜單(GtkMenu)稱為下拉式功能表。它通常用來作為放置功能表項目的容器

1.2 菜單的建立

  1. 建立一個菜單條
  2. 往菜單條上添加功能表項目(頂層功能表項目)
  3. 建立一個下拉式功能表,並將該下拉式功能表作為頂層功能表項目的子功能表

1.3 相關函數

  1. ==============================================================================
    菜單條操作
    gtk_menu_bar_new:建立菜單條
    gtk_menu_bar_append:往菜單條尾部添加功能表項目
    gtk_menu_bar_prepend:往菜單條首部添加功能表項目
    gtk_menu_bar_insert:往菜單條中指定的位置添加功能表項目
    ==============================================================================
  2. 功能表項目操作
    gtk_menu_item_new_with_label:建立帶有標籤的功能表項目
    gtk_menu_item_new:建立一個菜單分隔條(菜單分隔條實際上是不帶標籤的功能表項目)
    gtk_menu_item_set_submenu:將一個下拉式功能表設定成指定功能表項目的子功能表
    ==============================================================================
  3. 下拉式功能表操作
    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 菜單的建立詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.