UIマネージャ

次に、UIManagerを生成しActionGroupUIManagerに加えてください。それにはinsert_action_group()メソッドを使います。このときついでに、設定したアクセラレータキーを親ウィンドウに設定しておくのも悪くない考えです。add_accel_group()を使ってください。

次のようになります:

Glib::RefPtr<Gtk::UIManager> m_refUIManager = Gtk::UIManager::create();
m_refUIManager->insert_action_group(m_refActionGroup);
add_accel_group(m_refUIManager->get_accel_group());

さて、それではメニューとツールバーの実体的なレイアウトを定め、UIManagerにこのUIレイアウトを加えましょう。この「UI文字列」にはXMLフォーマットが使われており、さきほど生成したアクションの名前が記されています。例えば、このように:

    Glib::ustring ui_info =
        "<ui>"
        "  <menubar name='MenuBar'>"
        "    <menu action='MenuFile'>"
        "      <menuitem action='New'/>"
        "      <menuitem action='Open'/>"
        "      <separator/>"
        "      <menuitem action='Quit'/>"
        "    </menu>"
        "    <menu action='MenuEdit'>"
        "      <menuitem action='Cut'/>"
        "      <menuitem action='Copy'/>"
        "      <menuitem action='Paste'/>"
        "    </menu>"
        "  </menubar>"
        "  <toolbar  name='ToolBar'>"
        "    <toolitem action='Open'/>"
        "    <toolitem action='Quit'/>"
        "  </toolbar>"
        "</ui>";

    m_refUIManager->add_ui_from_string(ui_info);

気をつけてください、これらの名前はアクションを生成したときに用いた識別子です。ユーザーが実際に見る、メニューとツールバー上のテキストではありません。そちらの人間が読む方の名前はアクションを生成したときに設定しています。

Gtk::MenuBarGtk::Toolbarをインスタンス化して実際に表示させるためには、UIManager::get_widget()メソッドを使い、それから得られたウィジットをコンテナに加えてください。このように:

Gtk::Widget* pMenubar = m_refUIManager->get_widget("/MenuBar");
pBox->add(*pMenuBar, Gtk::PACK_SHRINK);