サンプルプログラム
[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(&argc, &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.2gtk-dev-2.12.9-win32-2 SourceForge.net: Glade/Gtk+ for Windows: Glade/Gtk+ for Windows
[C/C++] [GTK+] [MinGW]
・2009-06-14