線を引く(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`

結果