簡単な描画ツールを作成1
概要
簡単な描画ツールを作成する。ウィンドウの中でマウスをドラッグすると線を引く。 マウスのクリックとドラッグのイベントを取得するために on_button_press_event()とon_motion_notify_event()をオーバロードし、さらに
add_events( Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK )
と監視するイベントをadd_events()で追加する。
ソース
drawpic.cpp#include <gtkmm.h> class MyDrawArea : public Gtk::DrawingArea { Glib::RefPtr< Gdk::GC > m_gc; // ポインタの以前の座標 int m_pre_x; int m_pre_y; public: MyDrawArea(); private: void draw_line( int x1, int y1, int x2, int y2 ); protected: virtual void on_realize(); bool on_expose_event( GdkEventExpose* event ); virtual bool on_button_press_event( GdkEventButton* event ); virtual bool on_motion_notify_event( GdkEventMotion* event ); }; MyDrawArea::MyDrawArea() { // OFFになってるイベントを追加 add_events( Gdk::BUTTON_PRESS_MASK | Gdk::POINTER_MOTION_MASK ); } void MyDrawArea::on_realize() { // 元のon_realize()へのコールを忘れないこと Gtk::DrawingArea::on_realize(); m_gc = Gdk::GC::create( get_window() ); } bool MyDrawArea::on_expose_event( GdkEventExpose* event ) { // 背景を白く塗りつぶし int width = get_width(); int height = get_height(); m_gc->set_rgb_fg_color( Gdk::Color( "white" ) ); get_window()->draw_rectangle( m_gc, true, 0, 0, width, height ); return true; } // 線を引く void MyDrawArea::draw_line( int x1, int y1, int x2, int y2 ) { m_gc->set_rgb_fg_color( Gdk::Color( "red" ) ); m_gc->set_line_attributes( 4, Gdk::LINE_SOLID, Gdk::CAP_ROUND, Gdk::JOIN_ROUND ); get_window()->draw_line( m_gc, x1, y1, x2, y2 ); } // マウスクリック bool MyDrawArea::on_button_press_event( GdkEventButton* event ) { m_pre_x = (int)event->x; m_pre_y = (int)event->y; draw_line( m_pre_x, m_pre_y, m_pre_x, m_pre_y ); return true; } // マウスをドラッグした bool MyDrawArea::on_motion_notify_event( GdkEventMotion* event ) { if( event->state == Gdk::BUTTON1_MASK ){ int x2 = (int)event->x; int y2 = (int)event->y; draw_line( m_pre_x, m_pre_y, x2, y2 ); m_pre_x = x2; m_pre_y = y2; } return true; } class MainWin : public Gtk::Window { MyDrawArea m_drawarea; public: MainWin(){ resize( 400, 400 ); add( m_drawarea ); show_all_children(); } }; int main( int argc, char *argv[] ) { Gtk::Main kit( argc, argv ); MainWin mainwin; Gtk::Main::run( mainwin ); return 0; }
コンパイル
必要なコンパイルオプションは pkg-config を使って取得する。g++ drawpic.cpp -o drawpic `pkg-config gtkmm-2.4 --cflags --libs`
結果
