サンプルプログラム
[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