カーソルの形を変える

概要

カーソルの形を変更するにはGdk::Window::set_cursor()でカーソル( Gdk::Cursor )を指定する。 カーソルのタイプは enum Gdk::CursorType で定義されている。

ソース

setcursor.cpp
#include <gtkmm.h>

class MainWin : public Gtk::Window
{
    Gtk::Button m_button1, m_button2, m_button3;;
    Gtk::Label m_label;
    Gtk::HBox m_hbox;
    Gtk::VBox m_vbox;

public:
    MainWin();

private:
    void on_bt1_clicked();
    void on_bt2_clicked();
    void on_bt3_clicked();
};

MainWin::MainWin() :
    m_label( "カーソル変更テスト" ),
    m_button1( "カーソル1" ),
    m_button2( "カーソル2" ),
    m_button3( "元に戻す" )
{
    m_hbox.pack_start( m_button1, Gtk::PACK_SHRINK );
    m_hbox.pack_start( m_button2, Gtk::PACK_SHRINK );
    m_hbox.pack_start( m_button3, Gtk::PACK_SHRINK );

    m_vbox.pack_start( m_label );
    m_vbox.pack_start( m_hbox, Gtk::PACK_SHRINK );

    m_button1.signal_clicked().connect( sigc::mem_fun( *this, &MainWin::on_bt1_clicked ) );    
    m_button2.signal_clicked().connect( sigc::mem_fun( *this, &MainWin::on_bt2_clicked ) );    
    m_button3.signal_clicked().connect( sigc::mem_fun( *this, &MainWin::on_bt3_clicked ) );    

    add( m_vbox );
    show_all_children();
    resize( 200, 200 );
}


void MainWin::on_bt1_clicked()
{
    get_window()->set_cursor( Gdk::Cursor( Gdk::HAND1 ) );
}

void MainWin::on_bt2_clicked()
{
    get_window()->set_cursor( Gdk::Cursor( Gdk::WATCH   ) );
}

void MainWin::on_bt3_clicked()
{
    // 元に戻すときは引数無しでset_cursor()を呼ぶ
    get_window()->set_cursor();
}

int main( int argc, char *argv[] )
{
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}

コンパイル

必要なコンパイルオプションは pkg-config を使って取得する。

g++ setcursor.cpp -o setcursor `pkg-config gtkmm-2.4 --cflags --libs`

結果

ボタンを押すとカーソルの形が変わる。