ポップアップメニューの位置を指定する
概要
ポップアップメニューの位置を指定する。Gtk::Menu::popup()によってポップアップメニューを表示すると通常はマウスポインタの下に メニューを表示するが、好きな位置に表示したい場合はGtk::Menu::popup()の引数に スロット関数を指定してその関数の中で座標を指定する。例えば
void slot_position_calc( int& x, int& y, bool& push_in );
という関数を用意しておくとポップアップメニューが表示される直前に関数が 呼び出されるので、その時にx,y,push_inに値をセットしておく。ここでx,yは座標であり、 push_inがtrueの時はメニューが画面内に収まるように座標が自動調整される。
ソース
pmenu2.cpp
#include <gtkmm.h>
#include <iostream>
class MainWin : public Gtk::Window
{
Glib::RefPtr< Gtk::ActionGroup > m_actiongroup;
Glib::RefPtr< Gtk::UIManager > m_uimanager;
public:
MainWin();
private:
void on_popupmenu_test();
void slot_position_calc(int& x, int& y, bool& push_in);
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( "MenuTitle", "メニュー" ) );
m_actiongroup->add( Gtk::Action::create( "TestMenu", "テスト"), sigc::mem_fun( *this, &MainWin::on_popupmenu_test ) );
// UIマネージャの作成とアクショングループ挿入
m_uimanager = Gtk::UIManager::create();
m_uimanager->insert_action_group( m_actiongroup );
// ポップアップメニューのレイアウト
Glib::ustring ui_info =
"<ui>"
"<popup name='PopupMenu' >"
"<menuitem action='MenuTitle'/>"
"<menuitem action='TestMenu'/>"
"</popup>"
"</ui>";
m_uimanager->add_ui_from_string(ui_info);
}
// マウスクリック
bool MainWin::on_button_press_event( GdkEventButton* event )
{
Gtk::Menu* popupmenu = dynamic_cast< Gtk::Menu* >( m_uimanager->get_widget( "/PopupMenu" ) );
popupmenu->popup( sigc::mem_fun( *this, &MainWin::slot_position_calc ), event->button, event->time );
return true;
}
// シグナルハンドラ
void MainWin::on_popupmenu_test()
{
std::cout << "ok\n";
}
// ポップアップメニューの位置決め用関数
void MainWin::slot_position_calc( int& x, int& y, bool& push_in )
{
get_window()->get_root_origin( x, y );
push_in = false;
}
int main( int argc, char *argv[] )
{
Gtk::Main kit( argc, argv );
MainWin mainwin;
Gtk::Main::run( mainwin );
return 0;
}
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ pmenu2.cpp -o pmenu2 `pkg-config gtkmm-2.4 --cflags --libs`
結果