リンク
アクセスカウンタ

サンプルプログラム

[gtk_ui_manager_example.zip]
/********************************************************************/
/*
 * gtk_ui_manager_example.c
 * GTK によるメニューの作成サンプル.
 */
#define STRICT

#include <stdio.h>
#include <stdlib.h>

#include <gtk/gtk.h>

/********************************************************************/
/*
 * テスト用アクション
 */
static void activate_action(GtkAction *action)
{
    g_print("Action {%s} activated\n", gtk_action_get_name(action));
}

/********************************************************************/
/*
 * GtkActionEntry配列.
 * アクション名、アイコンのストックID、ラベル、ショートカットキー、
 * ツールチップ、フックするハンドルの対応を記述.
 */
static GtkActionEntry entries[] = 
{
      { "FileMenuAction", NULL, "ファイル(_F)" }    /* name, stock id, label */
    , { "EditMenuAction", NULL, "編集(_E)" }

    , {   "NewAction", GTK_STOCK_NEW                /* name, stock id */
        , "新規(_N)", "<control>N"                  /* label, accelerator */
        , "新規"                                    /* tooltip */
        , G_CALLBACK(activate_action) }

    , {   "OpenAction", GTK_STOCK_OPEN
        , "開く(_O)", "<control>O"
        , "開く"
        , G_CALLBACK(activate_action) }

    , {   "SaveAction", GTK_STOCK_SAVE
        , "上書き保存(_S)", "<control>S"
        , "上書き保存"
        , G_CALLBACK(activate_action) }

    , {   "SaveAsAction", GTK_STOCK_SAVE_AS
        , "名前を付けて保存(_A)", NULL
        , "名前を付けて保存"
        , G_CALLBACK(activate_action) }

    , {   "QuitAction", GTK_STOCK_QUIT
        , "メモ帳の終了(_X)", ""
        , "終了"
        , G_CALLBACK(activate_action) }

    , {   "UndoAction", GTK_STOCK_UNDO
        , "元に戻す(_U)", "<control>Z"
        , "元に戻す"
        , G_CALLBACK(activate_action) }

    , {   "CutAction", GTK_STOCK_CUT
        , "切り取り(_T)", "<control>X"
        , "切り取り"
        , G_CALLBACK(activate_action) }

    , {   "CopyAction", GTK_STOCK_COPY
        , "コピー(_C)", "<control>C"
        , "コピー"
        , G_CALLBACK(activate_action) }

    , {   "PasteAction", GTK_STOCK_PASTE
        , "貼り付け(_P)", "<control>V"
        , "貼り付け"
        , G_CALLBACK(activate_action) }

    , {   "DeleteAction", GTK_STOCK_DELETE
        , "削除(_L)", NULL
        , "削除"
        , G_CALLBACK(activate_action) }
};

/********************************************************************/
/*
 * エントリ数
 */
static guint n_entries = G_N_ELEMENTS(entries);

/********************************************************************/
/*
 * メニュー構造を表した文字列
 */
static const gchar *ui_info =
"<ui>"
"    <menubar name='MenuBar'>"
"        <menu name='FileMenu' action='FileMenuAction'>"
"            <menuitem name='New' action='NewAction' />"
"            <menuitem name='Open' action='OpenAction' />"
"            <menuitem name='Save' action='SaveAction' />"
"            <menuitem name='SaveAs' action='SaveAsAction' />"
"            <separator />"
"            <menuitem name='Quit' action='QuitAction' />"
"        </menu>"
"        <menu name='EditMenu' action='EditMenuAction'>"
"            <menuitem name='Undo' action='UndoAction'/>"
"            <separator />"
"            <menuitem name='Cut' action='CutAction'/>"
"            <menuitem name='Copy' action='CopyAction'/>"
"            <menuitem name='Paste' action='PasteAction'/>"
"            <menuitem name='Delete' action='DeleteAction'/>"
"        </menu>"
"    </menubar>"
"</ui>";

/********************************************************************/
/*
 * MenuManager の作成.
 */
static GtkUIManager *createMenuManager()
{
    GtkActionGroup  *action_group;  /* アクションのパッキンググループ用 */
    GtkUIManager    *menu_manager;  /* メニューマネージャ */
    GError          *gErrors = NULL;
    
    /* "TestActions"と言う名前のアクショングループを作成 */
    action_group = gtk_action_group_new("TestActions");
    
    /* UIマネージャを作成 */
    menu_manager = gtk_ui_manager_new();
    
    /* アクショングループにアクションを追加 */
    gtk_action_group_add_actions(action_group, entries, n_entries, NULL);
    
    /* UI マネージャ に アクショングループ を挿入.  */
    gtk_ui_manager_insert_action_group(menu_manager, action_group, 0);
    
    /* UI マネージャ に UI を追加 */
    if (!gtk_ui_manager_add_ui_from_string(menu_manager, ui_info, -1
            , &gErrors))
    {
        g_print("building menus failed: %s\n", gErrors->message);
        g_error_free(gErrors);
    }
    
    return menu_manager;
}

/********************************************************************/
/*
 * main 関数
 */
int main(int argc, char *argv[])
{
    GtkWidget       *window;        /* メインウィンドウ */
    GtkUIManager    *menu_manager;  /* メニューマネージャ */
    GtkWidget       *box1;
    
    /* GTK+ の初期化 */
    gtk_init(&amp;argc, &amp;argv);
    
    /* トップレベルウィンドウの作成 */
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
    /* メニューマネージャの作成 */
    menu_manager = createMenuManager();
    if (menu_manager == NULL)
    {
        return (-1);
    }
    
    /* アクセスグループへ登録 */
    gtk_window_add_accel_group(GTK_WINDOW(window)
            , gtk_ui_manager_get_accel_group(menu_manager));
    
    /* vboxを作成 */
    box1 = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), box1);
    
    /* vboxへメニューバーを追加 */
    gtk_box_pack_start(GTK_BOX(box1)
            , gtk_ui_manager_get_widget(menu_manager, "/MenuBar")
            , FALSE, FALSE, 0);
    
    /* シグナル接続 */
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_main_quit), NULL);
    
    /* ウィジェット の表示 */
    gtk_widget_show_all(window);
    
    /* メインループ */
    gtk_main();
    
    return 0;
}

実行結果

実行結果画像

動作確認環境:

MinGW gcc 3.4.2
gtk-dev-2.12.9-win32-2 SourceForge.net: Glade/Gtk+ for Windows: Glade/Gtk+ for Windows
[C/C++] [GTK+] [MinGW]
・2009-06-14

ページのTOPへ