メニューバー
概要
メニューバーを表示する。基本的にはポップアップメニューと同様にアクションをアクショングループに登録してUIマネージャでレイアウトしてから メニューバーをパックすれば良い。なおメニューバーのアクションとポップアップメニューのアクションはわざわざ別々に 作らなくても共通に使うことが出来るのに注意すること。以下のサンプルではメニューバーの表示だけではなく クライアント領域をクリックしたときにポップアップメニューも表示するようにしてある。
ソース
menubar.cpp
#include <gtkmm.h>
#include <iostream>
class MainWin : public Gtk::Window
{
Gtk::VBox m_box;
Glib::RefPtr< Gtk::ActionGroup > m_actiongroup;
Glib::RefPtr< Gtk::UIManager > m_uimanager;
public:
MainWin();
private:
void on_menu_test1();
void on_menu_test2();
protected:
virtual bool on_button_press_event( GdkEventButton* event );
};
MainWin::MainWin()
{
// OFFになってるイベントを追加
add_events( Gdk::BUTTON_PRESS_MASK );
// アクショングループの作成とアクション登録
m_actiongroup = Gtk::ActionGroup::create();
// メニューのラベル
m_actiongroup->add( Gtk::Action::create( "MenuTitle1", "メニュー1" ) );
m_actiongroup->add( Gtk::Action::create( "SubMenu", "サブメニュー" ) );
m_actiongroup->add( Gtk::Action::create( "MenuTitle2", "メニュー2" ) );
// ポップアップメニュのラベル
m_actiongroup->add( Gtk::Action::create( "PopupMenuTitle", "ポップアップメニュー" ) );
// 共通アクション
m_actiongroup->add( Gtk::Action::create( "TestMenu1", "テスト1" ), sigc::mem_fun( *this, &MainWin::on_menu_test1 ) );
m_actiongroup->add( Gtk::Action::create( "TestMenu2", "テスト2" ), sigc::mem_fun( *this, &MainWin::on_menu_test2 ) );
// UIマネージャの作成とアクショングループ挿入
m_uimanager = Gtk::UIManager::create();
m_uimanager->insert_action_group( m_actiongroup );
// メニューのレイアウト
try
{
Glib::ustring ui_info =
"<ui>"
// メニュー
"<menubar name='MenuBar'>"
" <menu action='MenuTitle1'>"
" <menu action='SubMenu'>"
" <menuitem action='TestMenu1'/>"
" <menuitem action='TestMenu2'/>"
" </menu>"
" <separator/>"
" <menuitem action='TestMenu2'/>"
" </menu>"
" <menu action='MenuTitle2'>"
" <menuitem action='TestMenu1'/>"
" <menuitem action='TestMenu2'/>"
" </menu>"
"</menubar>"
// ポップアップメニュー
"<popup name='PopupMenu' >"
" <menuitem action='PopupMenuTitle'/>"
" <menuitem action='TestMenu1'/>"
" <menuitem action='TestMenu2'/>"
"</popup>"
"</ui>";
m_uimanager->add_ui_from_string(ui_info);
}
catch(const Glib::Error& err )
{
std::cout << err.what() << std::endl;
}
// メニューのパック
resize( 300, 300 );
add( m_box );
Gtk::Widget* menubar = m_uimanager->get_widget( "/MenuBar" );
m_box.pack_start( *menubar, Gtk::PACK_SHRINK );
show_all_children();
}
// マウスクリック
bool MainWin::on_button_press_event( GdkEventButton* event )
{
Gtk::Menu* popupmenu = dynamic_cast< Gtk::Menu* >( m_uimanager->get_widget( "/PopupMenu" ) );
popupmenu->popup( event->button, event->time );
return true;
}
// シグナルハンドラ
void MainWin::on_menu_test1()
{
std::cout << "test1\n";
}
// シグナルハンドラ
void MainWin::on_menu_test2()
{
std::cout << "test2\n";
}
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ menubar.cpp -o menubar `pkg-config gtkmm-2.4 --cflags --libs`
結果