ダブル、トリプルクリックイベントの検出
概要
ダブル、トリプルクリックイベントを検出する。検出自体はGtk::Window::on_button_press_event()に渡されるGdkEventButton構造体の typeメンバーを見れば良いが、on_button_press_event()(及びon_button_release_event() )が 呼び出される順番に注意する必要がある。例えばトリプルクリックする場合は次の順番で GdkEventButton::typeに値が入って呼び出される。よってトリプルクリックする場合でも必ず シングル、ダブルクリックしたことが検知されるので注意する必要がある。
(1) GDK_BUTTON_PRESS
(2) GDK_BUTTON_RELEASE
(3) GDK_BUTTON_PRESS
(4) GDK_2BUTTON_PRESS
(5) GDK_BUTTON_RELEASE
(6) GDK_BUTTON_PRESS
(7) GDK_3BUTTON_PRESS
ソース
mclick2#include <gtkmm.h> #include <iostream> class MainWin : public Gtk::Window { public: MainWin(); protected: virtual bool on_button_press_event( GdkEventButton* event ); virtual bool on_button_release_event( GdkEventButton* event ); }; MainWin::MainWin() { // OFFになってるイベントを追加 add_events( Gdk::BUTTON_PRESS_MASK ); add_events( Gdk::BUTTON_RELEASE_MASK ); } // マウスクリック bool MainWin::on_button_press_event( GdkEventButton* event ) { switch( event->type ){ case GDK_BUTTON_PRESS: std::cout << "シングルクリック\n"; break; case GDK_2BUTTON_PRESS: std::cout << "ダブルクリック\n"; break; case GDK_3BUTTON_PRESS: std::cout << "トリプルクリック\n"; break; } return true; } // マウスリリース bool MainWin::on_button_release_event( GdkEventButton* event ) { switch( event->type ){ case GDK_BUTTON_RELEASE: std::cout << "リリース\n"; break; } return true; } int main( int argc, char *argv[] ) { Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ mclick2.cpp -o mclick2 `pkg-config gtkmm-2.4 --cflags --libs`
結果
トリプルクリックをすると次のように表示される
シングルクリック リリース シングルクリック ダブルクリック リリース シングルクリック トリプルクリック リリース