GTK+ 2.0 教學-Item Factory範例

這裡是一個使用 GTK 套件的示例。

#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’評論。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *