GTK 菜單的創建詳解


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,*menuitem
menubar=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 gint
my_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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM