線を引く(cairomm編)
概要
cairommを使ってGtk::DrawingAreaに線を引く
cairommも通常と同じようにon_expose_event()の中で描画する。
線を引くには Cairo::Contextを get_window()->create_cairo_context() で作成してから
Gdk::Cairo::set_source_color()で色を指定し、
Cairo::Context::move_to(), Cairo::Context::line_to()でパスを引いてから Cairo::Context::stroke()で描画する。
四角形で塗りつぶすにはCairo::Context::rectangle()で四角形のパスを引いてからCairo::Context::fill()
で現在の色で塗りつぶす。下の例では Gdk::Cairo::set_source_color()の代わりに
Cairo::Context::set_source_rgba()を使って半透明色の設定をしている。
ソース
drawline3.cpp#include <gtkmm.h> class MyDrawArea : public Gtk::DrawingArea { public: MyDrawArea(){} protected: virtual bool on_expose_event( GdkEventExpose* e ); }; bool MyDrawArea::on_expose_event( GdkEventExpose* event ) { int width = get_width(); int height =get_height(); Cairo::RefPtr< Cairo::Context > cairoctx = get_window()->create_cairo_context(); // 背景の塗りつぶし Gdk::Cairo::set_source_color( cairoctx, Gdk::Color( "black" ) ); cairoctx->paint(); // 線を引く Gdk::Cairo::set_source_color( cairoctx, Gdk::Color( "white" ) ); cairoctx->set_line_width( 1 ); cairoctx->move_to( 0, 0 ); cairoctx->line_to( width, height ); cairoctx->line_to( width/2, 0 ); cairoctx->stroke(); // alphaを指定して半透明の四角形で塗りつぶす Gdk::Color cl = Gdk::Color( "red" ); cairoctx->set_source_rgba( cl.get_red_p(), cl.get_green_p(), cl.get_blue_p(), 0.5 ); cairoctx->rectangle( width/4, height/4, width/2, height/2 ); cairoctx->fill(); return true; } class MainWin : public Gtk::Window { MyDrawArea m_drawarea; public: MainWin(){ 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++ drawline3.cpp -o drawline3 `pkg-config gtkmm-2.4 --cflags --libs`
結果
